在 django-filters 的 FilterSet 中使用全文搜索的最佳方式?
The best way to use full-text search in django-filters' FilterSet?
我的应用使用 rest-framework
和 django-filter
。我使用此 FilterSet
来提供 date
:
文章 (ModelViewSet
) 的过滤列表
from django_filters import rest_framework as filters
class ArticleFilter(filters.FilterSet):
start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')
class Meta:
model = Article
fields = ['pub_date']
我想在我的应用程序中添加搜索框,所以我需要另一个过滤器,它将在我的 Article
模型中使用全文搜索。我要搜索的字段是 title
和 description
。我决定添加带有 method
参数的 search
字段,如下所示:
from django_filters import rest_framework as filters
from django.contrib.postgres.search import SearchVector
class ArticleFilter(filters.FilterSet):
start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')
search = filters.CharFilter(method='filter_search')
def filter_search(self, queryset, name, value):
return queryset.annotate(search=SearchVector('title', 'description')).filter(search=value)
class Meta:
model = Article
fields = ['pub_date']
它有效,但我不确定它是否是使用全文搜索过滤的最佳方式。我是不是遗漏了什么或者这种方法可以吗?
我的应用使用 rest-framework
和 django-filter
。我使用此 FilterSet
来提供 date
:
ModelViewSet
) 的过滤列表
from django_filters import rest_framework as filters
class ArticleFilter(filters.FilterSet):
start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')
class Meta:
model = Article
fields = ['pub_date']
我想在我的应用程序中添加搜索框,所以我需要另一个过滤器,它将在我的 Article
模型中使用全文搜索。我要搜索的字段是 title
和 description
。我决定添加带有 method
参数的 search
字段,如下所示:
from django_filters import rest_framework as filters
from django.contrib.postgres.search import SearchVector
class ArticleFilter(filters.FilterSet):
start_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='gte')
end_date = filters.DateTimeFilter(field_name='pub_date', lookup_expr='lte')
search = filters.CharFilter(method='filter_search')
def filter_search(self, queryset, name, value):
return queryset.annotate(search=SearchVector('title', 'description')).filter(search=value)
class Meta:
model = Article
fields = ['pub_date']
它有效,但我不确定它是否是使用全文搜索过滤的最佳方式。我是不是遗漏了什么或者这种方法可以吗?