Using Django-filter with DRF

Viewed 1967

I am trying to use django-filter with DRF.

I am trying to do the integration with DRF documented here:

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

Here is my view class:

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})

However I feel I must be missing something - nothing is filtering.

Do I need a filter like this:

class PageFilter(filters.FilterSet):

with some logic in it?

I'm just not entirely sure how to get filtering to work here

1 Answers

You have to call self.filter_queryset otherwise it won't use the class in filter_backend (https://github.com/encode/django-rest-framework/blob/559088463b8625880e6a03dde804cb5a61da3088/rest_framework/generics.py#L140)

Consider doing the following:

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})

The example in django-filter documentation uses the ListAPIView, which calls self.filter_queryset inside its get implementation.

Related