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