From 4ff3af61b39914c3ef890f1378389b94c927e070 Mon Sep 17 00:00:00 2001 From: Anatoly Date: Wed, 22 Jan 2020 09:41:15 +0300 Subject: [PATCH] extend full-text search --- apps/account/filters.py | 8 +++++++- apps/account/models.py | 8 ++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/apps/account/filters.py b/apps/account/filters.py index 322b8b35..88c9e9f0 100644 --- a/apps/account/filters.py +++ b/apps/account/filters.py @@ -33,8 +33,14 @@ class AccountBackOfficeFilter(filters.FilterSet): return queryset def search_text(self, queryset, name, value): + queryset = queryset.annotate_vector() if value not in EMPTY_VALUES: - return queryset.search_text(value) + # search by exact value + filtered_qs = queryset.filter(vector=value) + if not filtered_qs.exists(): + # if filtered qs is None find something + filtered_qs = queryset.filter(vector__icontains=value) + return filtered_qs return queryset def by_role_country_code(self, queryset, name, value): diff --git a/apps/account/models.py b/apps/account/models.py index 373624e5..ab7e143c 100644 --- a/apps/account/models.py +++ b/apps/account/models.py @@ -144,9 +144,9 @@ class UserQuerySet(models.QuerySet): role = Role.objects.filter(role=Role.ESTABLISHMENT_MANAGER).first() return self.by_role(role).filter(userrole__establishment=establishment) - def annotate_search_text(self): + def annotate_vector(self): """Full-text search""" - return self.annotate(search_text=SearchVector( + return self.annotate(vector=SearchVector( 'username', 'first_name', 'last_name', @@ -154,10 +154,6 @@ class UserQuerySet(models.QuerySet): 'phone', )) - def search_text(self, value: str): - """Filter by annotated search vector.""" - return self.annotate_search_text().filter(search_text=value) - def by_role_country_code(self, country_code: str): """Filter by role country code.""" return self.filter(userrole__role__country__code=country_code).distinct()