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

如何在Django Rest Framework中用带方括号的查询参数按状态过滤

解决DRF中带括号的过滤参数捕获问题

一、处理status[]=1,14的情况

你之前的错误在于错误地将method名设置为带括号的形式,正确的做法是在定义FilterSet字段时,通过name参数指定查询参数的实际键(即status[]),method依然使用普通函数名即可。

修改后的代码:

class DepartmentFilter(filters.FilterSet):
    search = filters.CharFilter(method='filter_search')
    # 通过name参数指定要捕获的查询参数键为status[]
    status = filters.CharFilter(method='filter_status', name='status[]')

    class Meta:
        model = Department
        fields = ['search', 'status']

    def filter_search(self, queryset, name, value):
        return queryset.filter(Q(token__icontains=value))
    
    def filter_status(self, queryset, name, value):
        if value:
            status_values = value.split(',')
            return queryset.filter(status__id__in=status_values)
        return queryset

这样当请求携带status[]=1,14时,DRF会自动将该参数的值传给filter_status方法,逻辑和之前status=1,14的情况完全兼容。

二、处理filters[status][] = 1,14的情况

原理和上面一致,只需把name参数的值改成查询参数的实际键filters[status][]:

class DepartmentFilter(filters.FilterSet):
    search = filters.CharFilter(method='filter_search')
    # 指定捕获filters[status][]这个查询参数
    status = filters.CharFilter(method='filter_status', name='filters[status][]')

    class Meta:
        model = Department
        fields = ['search', 'status']

    def filter_search(self, queryset, name, value):
        return queryset.filter(Q(token__icontains=value))
    
    def filter_status(self, queryset, name, value):
        if value:
            status_values = value.split(',')
            return queryset.filter(status__id__in=status_values)
        return queryset

三、兼容多种参数格式(可选)

如果需要同时兼容status=1,14、status[]=1,14、filters[status][] = 1,14多种格式,可以在filter_status方法中手动从请求中获取参数:

class DepartmentFilter(filters.FilterSet):
    search = filters.CharFilter(method='filter_search')
    status = filters.CharFilter(method='filter_status')

    class Meta:
        model = Department
        fields = ['search', 'status']

    def filter_search(self, queryset, name, value):
        return queryset.filter(Q(token__icontains=value))
    
    def filter_status(self, queryset, name, value):
        # 依次尝试获取不同格式的参数
        status_param = self.request.GET.get('filters[status][]') or self.request.GET.get('status[]') or self.request.GET.get('status')
        if status_param:
            status_values = status_param.split(',')
            return queryset.filter(status__id__in=status_values)
        return queryset

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:52:31