DRF使用filterset_fields时如何给同一查询参数传递多个过滤值
解决方案
默认filterset_fields生成的id过滤器为精确单值匹配逻辑,多值传参会被默认解析为仅取最后一个值,因此无法实现多ID匹配,按以下步骤修改即可实现需求:
实现步骤
首先确保环境已安装django-filter依赖(DRF的DjangoFilterBackend依赖该库,当前正常用单值过滤的环境通常已安装,未安装可执行pip install django-filter)
1. 自定义多值匹配过滤器类
在对应APP目录下新建filters.py文件,写入以下代码:
from django_filters import rest_framework as filters from django_filters.filters import BaseInFilter, NumberFilter from .models import User # 定义数字类型的多值过滤器 class NumberInFilter(BaseInFilter, NumberFilter): pass class UserFilter(filters.FilterSet): # 配置id字段支持in查询,匹配多值 id = NumberInFilter(field_name='id', lookup_expr='in') class Meta: model = User fields = ['id']
2. 替换视图中的过滤配置
找到User接口对应的视图类,将原有filterset_fields配置替换为自定义的filterset_class:
from rest_framework import viewsets from .models import User from .serializers import UserSerializer from .filters import UserFilter from django_filters.rest_framework import DjangoFilterBackend class UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer filter_backends = [DjangoFilterBackend] # 注释/删除原来的 filterset_fields = ['id'] filterset_class = UserFilter
效果验证
配置完成后,两种传参方式都可以正常匹配多个ID:
- 逗号分隔传参:
api/user/?id=99,133,234 - 重复参数传参:
api/user/?id=99&id=133&id=234
扩展说明
如果需要给其他字段增加多值过滤能力,对应修改FilterSet即可:
- 字符串类型字段:自定义
CharInFilter继承BaseInFilter和CharFilter即可 - 其他类型字段同理,组合对应类型的Filter和
BaseInFilter即可
内容的提问来源于stack exchange,提问作者Avramo
相关产品推荐
相关产品推荐

