В моем приложении используются rest-framework
и django-filter
. Я использую этот FilterSet
для предоставления списка фильтрации статей (ModelViewSet
) по date
:
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
. Я решил добавить поле search
с параметром method
вот так:
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']
Это работает, но я не уверен, что это лучший способ использования фильтрации полнотекстового поиска. Я что-то упустил или этот подход в порядке?