2016-11-04 61 views
6

DRF (Django Rest Framework) kullanıyorum.Normal Filtreler Django Rest Framework'de SearchFilter ile birlikte nasıl kullanılır?

ModelViewSet bildirdim ve şimdi bunun üzerine filtre eklemek istiyorum. Ben satırları eklemeden önce mutlaka, başında çalıştı

filter_class = Filter 

: Bir Filtre alt sınıfını ilan etti ve bunu uygulamalı gören

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 

tarafından söylendi

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

the doc.

Ve şimdi arama filtresi, normal filter_class atlanırken uygulanır. Bir sözcük birlikte çalışamazlar.

Bu nasıl çalışır?

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 

Ya da belirli bir ViewSet sınıfına filter_backends alanı dikkate almayıp, ancak settings.py dünya çapında uygulamak:

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

Yani

+0

filter_class'ınızı başka bir sınıf adına yeniden adlandırın? ex. filter_class = My_Custom_Filter – Kishan

+0

@soupboy teşekkürler, bu sorun değil. Bir çözüm buldum ve cevap olarak gönderdim. Sadece cevabı buraya göndermek istiyorum. –

+0

@AlfredHuang Bu konu hakkında blogunuz var mı? Tam uygulamayı görmek istiyorum. Anlamak benim için hala zor. Çözümün ilginç. – Sarit

cevap

12

Son olarak, beraber ikisini filter_backends belirtmelidir bulundu filter_class ve search_fields seçeneklerinin ViewSet'te aynı anda kullanılabilir olduğunu.