1
1
from django .db .models import QuerySet
2
2
from 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
4
12
5
13
from .models import PostLike , PostDislike , Post , PostComment
6
14
7
15
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 :
12
18
return model_queryset
13
19
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
21
42
22
43
23
44
def 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) -
29
50
except PageNotAnInteger :
30
51
page_obj = paginator .page (1 )
31
52
53
+ except InvalidPage :
54
+ page_obj = paginator .page (1 )
55
+
32
56
except EmptyPage :
33
57
page_obj = paginator .page (paginator .num_pages )
34
58
0 commit comments