You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 10:00:07