Django Rest Framework ViewSet不会按字段过滤

时间:2018-06-19 17:40:09

标签: python django django-rest-framework

我有一个ModelViewSetSearchFilterOrderingFilter。一切正常,但是当我尝试按一个特定字段(例如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')

1 个答案:

答案 0 :(得分:1)

您可以使用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_filter添加到INSTALLED_APPS

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