【问题标题】:Using Django-filter with DRF将 Django 过滤器与 DRF 一起使用
【发布时间】:2023-03-13 00:34:02
【问题描述】:

我正在尝试将 django-filter 与 DRF 一起使用。

我正在尝试与此处记录的 DRF 进行集成:

https://django-filter.readthedocs.io/en/stable/guide/rest_framework.html

这是我的视图类:

class PageView(APIView):
    filter_backends = (filters.DjangoFilterBackend,)
    filter_fields = ('category', 'start_date', "end_date", "limit")

    def get(self, request):
        page_saves = Page.objects.all()
        serializer = PageSerializer(page_saves, many=True)
        return Response({"pages": serializer.data})

但我觉得我一定遗漏了一些东西 - 没有过滤。

我需要这样的过滤器吗:

class PageFilter(filters.FilterSet):

其中包含一些逻辑?

我只是不完全确定如何在这里进行过滤

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    你必须调用self.filter_queryset否则它不会使用filter_backend中的类(https://github.com/encode/django-rest-framework/blob/559088463b8625880e6a03dde804cb5a61da3088/rest_framework/generics.py#L140

    考虑执行以下操作:

    from rest_framework import generics
    class PageView(generics.GenericAPIView):
        filter_backends = (filters.DjangoFilterBackend,)
        filter_fields = ('category', 'start_date', "end_date", "limit")
    
        def get(self, request):
            page_saves = self.filter_queryset(Page.objects.all())
            serializer = PageSerializer(page_saves, many=True)
            return Response({"pages": serializer.data})
    

    django-filter 文档中的示例使用 ListAPIView,它在其 get 实现中调用 self.filter_queryset

    【讨论】:

    • 我得到 AttributeError: 'PageView' object has no attribute 'filter_queryset' - 我是否需要传入其他类以便 PageView 继承?
    • TypeError: 'Meta.fields' must not contain non-model field names: c, a, t, e, g, o, r, y 我觉得查询过滤器不应该这么难实施。
    • 如果您只使用一个值,您显然必须使用列表 arg:filter_fields = (['category']) 我暂时删除了其他值进行测试。但是,如果您有多个值,则不需要该列表: filter_fields = ('category', 'date')
    • 试试('category',)。没有尾随逗号('category')被评估为字符串。
    猜你喜欢
    • 2017-08-17
    • 2019-03-31
    • 2018-08-02
    • 1970-01-01
    • 2020-01-14
    • 2019-09-26
    • 2021-04-02
    • 2014-09-30
    • 2017-08-12
    相关资源
    最近更新 更多