私は、パラメータでフレキシブルに並べ替えることと、パラメータでフィルタリングすることの両方を必要とするビューセットをカスタム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()
に直接適用する必要があり、そうでないとバイパスされるようです。
モデルを使用しているので 'viewset.ListViewSet'や' viewset.ModelViewSet'をサブクラス化しないと、継承されるので 'list'を指定する必要はありません。 –