Django REST Framework中filter_fields配置后过滤不生效问题求助
Django DRF filter_fields过滤不生效问题修复方案
问题根本原因:你的代码中仅配置了filter_fields属性,但filter_backends数组未加入字段过滤对应的后端类DjangoFilterBackend,导致过滤规则无法被识别加载。
可行修复步骤如下:
- 先确认安装了django-filter依赖,未安装的话执行命令:
pip install django-filter - 在项目
settings.py的INSTALLED_APPS中注册django_filters:
INSTALLED_APPS = [ # 其他原有应用 'django_filters', ]
- 修改当前views.py的
filter_backends配置,添加DjangoFilterBackend,修改后完整代码如下:
from django_filters.rest_framework import DjangoFilterBackend class BannerViewSet(ResponseViewMixin, viewsets.ModelViewSet): serializer_class = BannerSerializers queryset = Banner.objects.all() # 新增DjangoFilterBackend到过滤后端数组 filter_backends = (filters.SearchFilter, filters.OrderingFilter, DjangoFilterBackend) search_fields = ('title', 'sort_order', 'type') filter_fields = ('type',) def list(self, request, **kwargs): try: queryset = self.get_queryset() queryset = self.filter_queryset(queryset) serializer = BannerSerializers(queryset, many=True) response_data = {'Banner': serializer.data} return self.jp_response(s_code='HTTP_200_OK', data=response_data) except Exception as e: print(e) return self.jp_error_response('HTTP_500_INTERNAL_SERVER_ERROR', 'EXCEPTION', [str(e), ])
- 接口请求时按照规则传参即可,比如要过滤type值为2的banner,请求地址加参数
?type=2即可生效。
可选全局配置方案:如果需要所有接口都默认支持字段过滤、搜索、排序,可直接在settings.py中加全局配置,不需要每个ViewSet单独写filter_backends:
REST_FRAMEWORK = { 'DEFAULT_FILTER_BACKENDS': [ 'django_filters.rest_framework.DjangoFilterBackend', 'rest_framework.filters.SearchFilter', 'rest_framework.filters.OrderingFilter', ] }
内容的提问来源于stack exchange,提问作者user15361826
相关产品推荐
相关产品推荐

