如何使用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
相关产品推荐
相关产品推荐

