首页 > 解决方案 > Django Rest Framework ViewSet 不按字段过滤

问题描述

我有一个ModelViewSetwithSearchFilterOrderingFilter。一切正常,但是当我尝试按一个特定字段(如localhost:8000:/es/countries/?code=MX)过滤时,即使只有一个符合条件,它也会返回所有记录。当我使用通用搜索时,例如localhost:8000:/es/countries/?search=MX,它工作正常。

这是我的ViewSet

class CountryViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = models.Country.objects.all()
    serializer_class = serializers.CountrySerializer
    filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter,)
    search_fields = ('name', 'code', 'calling_code')
    filter_fields = ('name', 'code', 'calling_code')

标签: pythondjangodjango-rest-framework

解决方案


您可以使用DjangoFilterBakend

在您使用 search_fields 的代码中,它仅适用于搜索参数。(因为它用于搜索和过滤!!)

您需要添加 DjangoFilterBackend,就像在 filter_backends 字段中添加 SearchFilter 和 OrderingFilter 一样。然后在 filter_fields 字段中提及您想要的过滤器。

例如:

class CountryViewSet(viewsets.ModelViewSet):
   permission_classes = (permissions.IsAuthenticated,)
   queryset = models.Country.objects.all()
   serializer_class = serializers.CountrySerializer
   filter_backends = (SearchFilter, OrderingFilter, DjangoFilterBackend)
   search_fields = ('name', 'code', 'calling_code')
   filter_fields = ('name', 'code', 'calling_code')

您还必须安装 django-filter。

pip install django-filter

最后添加django_filterINSTALLED_APPS.

INSTALLED_APPS = [
    ....
    'django_filters',
]

推荐阅读