2016-11-04 102 views
6

我正在使用DRF(Django Rest Framework)。如何在Django Rest Framework上使用普通Filter和SearchFilter?

我宣佈了一個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 

或者,我們可以在一個特定的ViewSet類忽略filter_backends場,但在settings.py它們全局應用:所以

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

同時在ViewSet上可以使用filter_classsearch_fields選項。

相關問題