2017-12-17 5 views
0

私は、パラメータでフレキシブルに並べ替えることと、パラメータでフィルタリングすることの両方を必要とするビューセットをカスタムlist()オーバーライドしました。 django-filterでさまざまなパラメータのフィルタリングと同様に動作するよう注文することができますが、両方を同時に機能させることはできません。ここでDjango Rest Framework:OrderingFilterとdjango-filterを同時に使用する問題

は結果を注文するために働く私の簡略化views.pyコードです:

class AssetViewSet(viewsets.GenericViewSet, AssetPaginationMixin,): 

    queryset = Asset.objects.all() 
    pagination_class = AssetPagination 
    serializer_class = serializers.AssetSerializer 
    filter_backends = (OrderingFilter,) 
    ordering_fields = ('id', 'session_id') 
    filter_class = AssetFilterSet 

    def list(self, request): 
     assets = self.filter_queryset(self.get_queryset()) 
     serializer = self.get_serializer(assets, many=True) 
     return Response(serializer.data) 

そしてここでは、フィルタリングのために動作するコードです:

class AssetViewSet(viewsets.GenericViewSet, AssetPaginationMixin,): 

    queryset = Asset.objects.all() 
    pagination_class = AssetPagination 
    serializer_class = serializers.AssetSerializer 
    filter_backends = (OrderingFilter,) 
    ordering_fields = ('id', 'session_id') 
    filter_class = AssetFilterSet 

    def list(self, request): 
     assets = AssetFilterSet(request.query_params) 
     serializer = self.get_serializer(assets, many=True) 
     return Response(serializer.data) 

そして最後に、私のfilters.pyコード:

class AssetFilterSet(django_filters.FilterSet): 
    project_id = django_filters.NumberFilter() 
    submitted = django_filters.TypedChoiceFilter(choices=BOOLEAN_CHOICES, coerce=strtobool) 
    class Meta: 
     model = Asset 
     fields = ['project', 
        'submitted'] 

唯一の違いは、最初のl list()にあります。何らかの理由で、filter_class = AssetFilterSetに指定されていても、にself.filter_querysetを使用すると、AssetFilterSetが有効になるためにはlist()に直接適用する必要があり、そうでないとバイパスされるようです。

+0

モデルを使用しているので 'viewset.ListViewSet'や' viewset.ModelViewSet'をサブクラス化しないと、継承されるので 'list'を指定する必要はありません。 –

答えて

0

私は自分の質問に答えます。それは非常に単純な修正であることが分かります。 DjangoFilterBackendOrderingFilterfilter_backendsと明示的に含める必要があります(DjangoFilterBackendがSETTINGSにグローバルに指定されています)。ここで

は、作業コードです:

class AssetViewSet(viewsets.GenericViewSet, AssetPaginationMixin,): 

    queryset = Asset.objects.all() 
    pagination_class = AssetPagination 
    serializer_class = serializers.AssetSerializer 
    filter_backends = (DjangoFilterBackend, OrderingFilter,) 
    ordering_fields = ('id', 'session_id') 
    filter_class = AssetFilterSet 

    def list(self, request): 
     assets = self.filter_queryset(self.get_queryset()) 
     serializer = self.get_serializer(assets, many=True) 
     return Response(serializer.data) 

私はSETTINGSでDjangoFilterBackendを指定すると、それがデフォルトで含まれることになるとfilter_backendsフィルタを追加すると、それに代わるものではありませ、それに追加することを意味しているという印象の下にありました。生活し、学びます!

関連する問題