如何在 DRF 中使用 django-filter

How to use django-filter in DRF

在这里你可以看到我带过滤器的观点

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

在下方查找我的此视图的网址 class

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

最后是我的序列化程序

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

所以,主要问题是我向

发送了一个 GET 请求
http://localhost:8000/api/v1/tag/select?max_price=10000

并从我的 postgres 数据库接收所有记录,过滤器不起作用,有人可以解释为什么吗?随意回答。

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

直接使用filterset过滤

需要指定django-filters提供的filter_backend
from django_filters import rest_framework as filters

class FindByTag(generics.ListAPIView):
    queryset = Ad.objects.all()
    serializer_class = AdDetailSerializer
    <b>filter_backends = (filters.DjangoFilterBackend,)
    filterset_class = ProductFilter</b>

编辑

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