2015-11-11 99 views
2

我有一個模型可以說ObservedMoves。我的視圖中的許多查詢都引用了此模型。因此,我沒有在每個視圖中直接應用我想要的濾鏡,而是將它們抽象到濾鏡類中,例如ObservedMovesFilters,其子類django_filters.Filterset並具有元字段model = ObservedMoves我如何使用OrderingFilter以及其他篩選器在模型上篩選

現在我想要做的是讓用戶在提出請求時指定排序字段。爲此,我打算使用DRF的OrderingFilter。如果我嘗試繼承OrderingFilter類而不是Filterset類,則過濾器不起作用。如果我再次指定OrderingFilter作爲默認的過濾器後端,則過濾器不起作用。

在DRF的文檔中,唯一給出的方法是在視圖內指定替代過濾器後端並指定排序參數,但是我希望避免在查詢該模型的每個視圖中明確定義它。有沒有辦法做到這一點?

回答

2

您必須指定在ViewSet叫另一場filter_backends

filter_backends = (filters.DjangoFilterBackend,filters.OrderingFilter,) 

例如

from rest_framework import filters 
import django_filters 

class UserFilter(django_filters.FilterSet): 
    [...] 

class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 
    #vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv 
    filter_backends = (filters.DjangoFilterBackend,filters.OrderingFilter,) 
    filter_class = UserFilter 
    ordering = ('username',) 
+0

因爲我還是要在每一個視圖或視圖集顯式地指定後端但至少它的工作原理這部分解決了這個問題。 – LetsPlayYahtzee

+1

您可以對ModelViewSet(或其他)進行子類化,並添加一個「filter_backends」字段,該字段將作爲您的模型的默認字段。 –

4

如果我的理解是否正確,你不必添加filter_backendsViewSet像對方回答說。

您只需設置您的默認篩選器後端在settings.py文件是這樣的:

REST_FRAMEWORK = { 
    'DEFAULT_FILTER_BACKENDS': (
     'rest_framework.filters.DjangoFilterBackend', 
     'rest_framework.filters.OrderingFilter', 
    ) 
}