Search code examples
djangodjango-rest-frameworkgetdjango-filter

How to use django-filter in DRF


Here u can see my views with filter

class ProductFilter(django_filters.FilterSet):
    min_price = django_filters.NumberFilter(name="price", lookup_type='gte')
    max_price = django_filters.NumberFilter(name="price", lookup_type='lte')

    class Meta:
        model = Ad
        fields = ['min_price', 'max_price']


class FindByTag(generics.ListAPIView):
    queryset = Ad.objects.all()
    serializer_class = AdDetailSerializer
    filter_class = ProductFilter

Look down below for my urls for this view class

urlpatterns = [
    path('api/v1/tag/select?', FindByTag.as_view())
]

And finally my serializer

class AdDetailSerializer(serializers.ModelSerializer):
    class Meta:
        model = Ad
        fields = '__all__'

So, the main problem is that i send a GET request to

http://localhost:8000/api/v1/tag/select?max_price=10000

and receive all records from my postgres db, filter doesn't work, can someone explain me why? Fell free to answer.


Solution

  • Integration with Django Rest Framework is provided through a DRF-specific FilterSet and a filter backend. These may be found in the rest_framework sub-package

    You need to specify the filter_backend provided by django-filters if you would like to directly use the filterset for filtering

    from django_filters import rest_framework as filters
    
    class FindByTag(generics.ListAPIView):
        queryset = Ad.objects.all()
        serializer_class = AdDetailSerializer
        filter_backends = (filters.DjangoFilterBackend,)
        filterset_class = ProductFilter
    

    EDIT

    class ProductFilter(django_filters.FilterSet):
        min_price = django_filters.NumberFilter(field_name="price", lookup_expr='gte')
        max_price = django_filters.NumberFilter(field_name="price", lookup_expr='lte')