我有一个 View 集,需要同时具有按参数灵活排序和按参数过滤的自定义 list()
超越。我可以通过 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']
唯一的区别是 list()
中的第一行。由于某种原因,它看起来像 AssetFilterSet
需要直接在list()
内应用为了生效,否则如果我使用 self.filter_queryset
则会被绕过在list()
尽管由 filter_class = AssetFilterSet
指定.
最佳答案
我会回答我自己的问题。事实证明这是一个非常简单的修复方法;尽管在 SETTINGS 中全局指定了 DjangoFilterBackend
,但您必须显式地将 DjangoFilterBackend
和 OrderingFilter
包含为 filter_backends
。
这是工作代码:
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
过滤器会添加到它,而不是替换它。活到老,学到老!
关于python - Django休息框架: Issue using OrderingFilter and django-filter simultaneously,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47858295/