Alf*_*ang 11 python django rest filter django-rest-framework
我正在使用DRF(Django Rest Framework).
我声明了一个ModelViewSet,现在我想在其上添加过滤器.
class GoodsViewSet(viewsets.ModelViewSet):
class Filter(FilterSet):
class Meta:
model = m.Goods
filter_class = Filter
filter_backends = (SearchFilter, Filter)
search_fields = ['name',]
queryset = m.Goods.objects.all()
serializer_class = s.GoodsSerializer
Run Code Online (Sandbox Code Playgroud)
看到我声明了一个Filter子类并将其应用于:
filter_class = Filter
Run Code Online (Sandbox Code Playgroud)
在我添加行之前,它在开始时工作:
filter_backends = (SearchFilter, Filter)
search_fields = ['name',]
Run Code Online (Sandbox Code Playgroud)
现在,在filter_class跳过法线时应用搜索过滤器.
一句话,他们无法一起工作.
如何解决这个问题?
Alf*_*ang 20
最后,我发现我们应该filter_backends一起指定两个:
from rest_framework.filters import SearchFilter
from django_filters.rest_framework import DjangoFilterBackend
class GoodsViewSet(viewsets.ModelViewSet):
class Filter(FilterSet):
class Meta:
model = m.Goods
filter_class = Filter
filter_backends = (SearchFilter, DjangoFilterBackend)
search_fields = ['name',]
queryset = m.Goods.objects.all()
serializer_class = s.GoodsSerializer
Run Code Online (Sandbox Code Playgroud)
或者我们可以忽略filter_backends特定ViewSet类的字段,但全局应用于settings.py:
REST_FRAMEWORK = {
# ... other configurations
'DEFAULT_FILTER_BACKENDS': (
'rest_framework.filters.SearchFilter',
'django_filters.rest_framework.DjangoFilterBackend',
),
}
Run Code Online (Sandbox Code Playgroud)
这样,View filter_class和search_fieldsView可以同时在ViewSet上使用.