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

