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

如何使用Django-filter在Django Rest Framework中实现多字段过滤

DRF多字段筛选功能修复方案

1. 修复路由注册错误

你当前报错的核心原因是基于类的视图没有调用.as_view()方法,Django路由需要绑定可调用的视图函数,不能直接传入类对象。修改urls.py对应配置:

urlpatterns = [ 
        url(r'^api/practice-filter-user$', views.practiceFilter_User),
        # 类视图必须加.as_view()
        url(r'^api/practice-filter-subcategory-user$', views.practiceFilter_Subcategory_User.as_view()),
]

修改后即可解决__init__() takes 1 positional argument but 2 were given报错。

2. 修正筛选逻辑配置

因为category是Subcategory模型的字段,和Practice通过外键subcategory关联,不能直接写在filter_fields中,需要配置关联路径。为了匹配你期望的user=1&category=Math参数格式,推荐自定义筛选类:

第一步:新增自定义筛选器

在views.py中导入依赖并新增筛选类:

from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from .models import Practice

# 自定义筛选器,映射参数名到数据库关联字段
class PracticeFilter(filters.FilterSet):
    # 参数名user对应user表的user_id字段
    user = filters.NumberFilter(field_name='user__user_id', lookup_expr='exact')
    # 参数名category对应subcategory表的category字段
    category = filters.CharFilter(field_name='subcategory__category', lookup_expr='exact')
    
    class Meta:
        model = Practice
        fields = ['user', 'category']

第二步:修改视图类配置

更新你的视图类,指定筛选后端和自定义筛选器:

class practiceFilter_Subcategory_User(generics.ListAPIView):
    queryset = Practice.objects.all()
    serializer_class = PracticeSerializer
    # 指定筛选后端
    filter_backends = [DjangoFilterBackend]
    # 绑定自定义筛选器
    filterset_class = PracticeFilter

如果你已经在settings.py的REST_FRAMEWORK配置中全局注册了DjangoFilterBackend,可以省略视图类中的filter_backends配置,全局配置参考:

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend']
}

3. 接口测试

修改完成后访问接口:http://你的服务地址/api/practice-filter-subcategory-user?user=1&category=Math,即可返回你预期的2条Math分类数据。


内容的提问来源于stack exchange,提问作者Aras121

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:39:03