Search code examples
django-rest-frameworkdjango-filter

Using django-filter overriding list method in drf


I'm using django-filter to filter my viewsets in drf.

When I have a ModelViewset, works fine like example bellow:

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

My problem is when I override the list method using a ViewSet, like this:

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

In this case my filters does not working. Is there a way of using django-filter in this case (overriding list)?

I know what I can do with query_params, but I would like to use django-filter.


Solution

  • First, you should take a look at how the list method is implemented:

    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-filter is applied at this point queryset = self.filter_queryset(self.get_queryset()).

    So if you want to override the list method but keep the the filtering feature, then make sure to call self.filter_queryset() with the queryset.