2016-11-04 5 views
6

私はDRF(Django Rest Framework)を使用しています。Django Rest FrameworkのSearchFilterと一緒に通常のフィルタを使用するには?

私はModelViewSetを宣言しましたが、今ではフィルターを追加したいと思います。私は、行を追加する前にそれは、冒頭で働いていた

filter_class = Filter 

::私はフィルターのサブクラスを宣言し、それを適用することを見て

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_backends = (SearchFilter, Filter) 
search_fields = ['name',] 

the doc

これで、通常のfilter_classをスキップして検索フィルタが適用されます。

一言で言えば、一緒に働くことはできません。

この問題を回避するには?

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 

それとも、我々は特定のViewSetクラスにfilter_backendsフィールドを無視することができますが、settings.pyでグローバルに適用します:

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

をそう

+0

filter_classの名前を他のクラス名に変更しますか?例。 filter_class = My_Custom_Filter – Kishan

+0

@soupboyありがとう、その問題ではありません。私は解決策を見つけ出し、答えとして投稿しました。私はちょうど答えをここに掲示したいと思う。 –

+0

@AlfredHuangこの問題に関するブログがありますか?私は完全な実装を見たいと思います。私が理解することはまだ難しいです。あなたのソリューションは面白いです。 – Sarit

答えて

12

最後に、私たちは一緒に2 filter_backendsを指定する必要が見つかりましたfilter_classsearch_fieldsオプションが同時にビューセットで使用できることを確認してください。

関連する問題