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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.16 04:06:12