11from django .db .models import QuerySet
22from django .db .models import Q
3- from django .core .paginator import Paginator , Page , EmptyPage , PageNotAnInteger
3+ from django .contrib .postgres .search import SearchQuery , SearchRank , SearchVector
4+ from django .core .paginator import (
5+ Paginator ,
6+ Page ,
7+ EmptyPage ,
8+ PageNotAnInteger ,
9+ InvalidPage ,
10+ )
11+ from django .conf import settings
412
513from .models import PostLike , PostDislike , Post , PostComment
614
715
8- def get_search_model_queryset (
9- model_queryset : QuerySet , search_query : str = None
10- ) -> QuerySet :
11- if not search_query :
16+ def get_search_model_queryset (model_queryset : QuerySet , query : str = None ) -> QuerySet :
17+ if not query :
1218 return model_queryset
1319
14- search_query = model_queryset .filter (
15- Q (title__icontains = search_query )
16- | Q (description__icontains = search_query )
17- | Q (content__icontains = search_query )
18- )
19-
20- return search_query
20+ search_vector = SearchVector ("title" , "description" , "content" )
21+ search_query = SearchQuery (query )
22+
23+ if settings .DATABASES ["default" ]["ENGINE" ] == "django.db.backends.postgresql" :
24+ # PostgreSQL search
25+ queryset = (
26+ model_queryset .annotate (
27+ search = search_vector ,
28+ rank = SearchRank (search_vector , search_query ),
29+ )
30+ .filter (search = search_query )
31+ .order_by ("-rank" )
32+ )
33+ else :
34+ # SQLite3 search
35+ queryset = model_queryset .filter (
36+ Q (title__icontains = query )
37+ | Q (description__icontains = query )
38+ | Q (content__icontains = query )
39+ )
40+
41+ return queryset
2142
2243
2344def get_pagination_obj (model_queryset : QuerySet , page : int = 1 , size : int = 4 ) -> Page :
@@ -29,6 +50,9 @@ def get_pagination_obj(model_queryset: QuerySet, page: int = 1, size: int = 4) -
2950 except PageNotAnInteger :
3051 page_obj = paginator .page (1 )
3152
53+ except InvalidPage :
54+ page_obj = paginator .page (1 )
55+
3256 except EmptyPage :
3357 page_obj = paginator .page (paginator .num_pages )
3458
0 commit comments