Как использовать обычный фильтр вместе с SearchFilter на Django Rest Framework?
Я использую DRF (Django Rest Framework).
Я объявил ModelViewSet, и теперь я хочу добавить фильтры на это.
class GoodsViewSet(viewsets.ModelViewSet):
class Filter(FilterSet):
class Meta:
model = m.Goods
filter_class = Filter
filter_backends = (SearchFilter, Filter)
search_fields = ['name',]
queryset = m.Goods.objects.all()
serializer_class = s.GoodsSerializer
видя, что я объявил подкласс фильтра и применил его с:
filter_class = Filter
это сработало в начале, прежде чем я добавлю строки:
filter_backends = (SearchFilter, Filter)
search_fields = ['name',]
что было сказано док.
и теперь фильтр поиска применяется в то время как нормальный filter_class
пропускается.
одним словом, они не можем работать вместе.
как обойти это?
1 ответов
наконец, я обнаружил, что мы должны указать два filter_backends
вместе:
from rest_framework.filters import SearchFilter
from django_filters.rest_framework import DjangoFilterBackend
class GoodsViewSet(viewsets.ModelViewSet):
class Filter(FilterSet):
class Meta:
model = m.Goods
filter_class = Filter
filter_backends = (SearchFilter, DjangoFilterBackend)
search_fields = ['name',]
queryset = m.Goods.objects.all()
serializer_class = s.GoodsSerializer
или мы можем игнорировать filter_backends
поле на определенной ViewSet
класс, но применить их глобально, в settings.py
:
REST_FRAMEWORK = {
# ... other configurations
'DEFAULT_FILTER_BACKENDS': (
'rest_framework.filters.SearchFilter',
'django_filters.rest_framework.DjangoFilterBackend',
),
}
так что filter_class
и search_fields
опции доступны на ViewSet в то же время.