python - Django休息框架: Issue using OrderingFilter and django-filter simultaneously

标签 python django django-rest-framework

我有一个 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,但您必须显式地将 DjangoFilterBackendOrderingFilter 包含为 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/

相关文章:

python - Django 十进制字段无法存储应该没问题的 float

python - 如何从 Python 中的字符串列表制作直方图?

python - Django REST Framework 中的并行序列化?或者其他加速模型序列化的方法?

django - 尝试将一些应用程序集成到我的项目中

django - 具有多个ID的DjangoFilterBackend

django - 如何使用 Postman 使用参数命中 Django api?

python - 使用 heapy 追踪 Django 应用程序中的内存泄漏

python - 数据框使用 DatetimeIndex 选择数据

django - 在heroku上部署django网站出错

django - Django REST Framework 中的命名 JSON 数组