【问题标题】:Using django-filter overriding list method in drf在 drf 中使用 django-filter 覆盖列表方法
【发布时间】:2020-09-13 14:54:05
【问题描述】:

我正在使用 django-filter 过滤我在 drf 中的视图集。

当我有 ModelViewset 时,可以正常工作,如下例所示:

class MyExampleViewSet(viewsets.ModelViewSet):
    queryset = myqueryset
    model = ModelExample
     filter_backends = (DjangoFilterBackend, OrderingFilter,)
     filterset_fields = {
         "field_example": ["exact", "icontains"],
         "another_field_example": ["exact", "range"],
     }
     serializer_class = MyExampleViewSet

我的问题是当我使用ViewSet 覆盖list 方法时,如下所示:

class MyExampleViewSet(viewsets.ViewSet):
    def list(self, request, queryset=queryset, *args, **kwargs):
        return something

在这种情况下,我的过滤器不起作用。在这种情况下(覆盖列表)有没有使用 django-filter 的方法?

我知道我可以用 query_params 做什么,但我想使用 django-filter。

【问题讨论】:

    标签: django-rest-framework django-filter


    【解决方案1】:

    首先,你应该看看list方法是如何实现的:

    def list(self, request, *args, **kwargs):
        queryset = self.filter_queryset(self.get_queryset())
    
        page = self.paginate_queryset(queryset)
        if page is not None:
            serializer = self.get_serializer(page, many=True)
            return self.get_paginated_response(serializer.data)
    
        serializer = self.get_serializer(queryset, many=True)
        return Response(serializer.data)
    

    Django 过滤器在此时应用queryset = self.filter_queryset(self.get_queryset())

    因此,如果您想覆盖列表方法但保留过滤功能,请确保使用查询集调用self.filter_queryset()

    【讨论】:

      猜你喜欢
      • 2020-11-06
      • 1970-01-01
      • 2021-05-09
      • 2011-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      相关资源
      最近更新 更多