2016-11-04 1 views
6

Я использую DRF (Django Rest Framework).Как использовать обычный фильтр вместе с SearchFilter на 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',] 

Что было сказано the doc.

И теперь фильтр поиска применяется, когда нормальный filter_class пропущен.

Одно слово, они не могут работать вместе.

Как обойти это?

+0

переименуйте свой filter_class в другое имя класса? ех. filter_class = My_Custom_Filter – Kishan

+0

@soupboy спасибо, не то, что проблема. Я разработал решение и разместил его как ответ. Я просто хочу опубликовать ответ здесь. –

+0

@AlfredHuang У вас есть блог по этой проблеме? Я хочу увидеть полную реализацию. Мне все еще трудно понять. Ваше решение интересно. – Sarit

ответ

12

Наконец, я нашел, мы должны указать два 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.

Смежные вопросы