在 drf 中使用 django-filter 覆盖列表方法

Joe*_*ran 2 django-filter django-rest-framework

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Ken*_*ars 5

首先,您应该看看该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)
Run Code Online (Sandbox Code Playgroud)

此时应用了 Django-filter queryset = self.filter_queryset(self.get_queryset())

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