Joey Fran
Joey Fran

Reputation: 627

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.

Upvotes: 5

Views: 2663

Answers (1)

Ken4scholars
Ken4scholars

Reputation: 6296

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.

Upvotes: 11

Related Questions