Как использовать обычный фильтр вместе с 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 в то же время.