2016-11-04 65 views
6

Używam DRF (Django Rest Framework).Jak korzystać z normalnego filtru razem z funkcją SearchFilter w środowisku Django Rest Framework?

Ogłosiłem ModelViewSet, a teraz chcę dodać filtry na ten temat.

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 

Widząc, że ogłoszony klasa filtra sub i stosować go z:

filter_class = Filter 

To działało na początku, zanim dodam linie:

filter_backends = (SearchFilter, Filter) 
search_fields = ['name',] 

Który został poinformowany przez the doc.

A teraz filtr wyszukiwania jest stosowany, podczas gdy normalny filter_class jest pomijany.

Jedno słowo, nie mogą ze sobą współpracować.

Jak obejść ten problem?

+0

zmień nazwę swojej klasy filter_class na inną nazwę klasy? dawny. filter_class = My_Custom_Filter – Kishan

+0

@soupboy dziękuję, nie ten problem. Opracowałem rozwiązanie i opublikowałem jako odpowiedź. Po prostu chcę opublikować odpowiedź tutaj. –

+0

@AlfredHuang Czy masz bloga na ten temat? Chcę zobaczyć pełną implementację. Nadal trudno mi to rozgryźć. Twoje rozwiązanie jest interesujące. – Sarit

Odpowiedz

12

Wreszcie znalazłem powinniśmy określić dwa filter_backends razem:

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 

Albo możemy zignorować pole filter_backends na konkretnym ViewSet klasy, ale stosuje je globalnie w settings.py:

REST_FRAMEWORK = { 
    # ... other configurations 
    'DEFAULT_FILTER_BACKENDS': (
     'rest_framework.filters.SearchFilter', 
     'django_filters.rest_framework.DjangoFilterBackend', 
    ), 
} 

Tak opcje filter_class i search_fields są dostępne w ViewSet w tym samym czasie.