Django REST Framework自定义FilterSet的__in多值查询不生效如何解决?
问题原因及解决方法
核心问题有两个:
- 过滤类
ProductFilter的字段配置未显式开放__in查找权限
你当前在Meta.fields中直接以列表形式声明过滤字段,django-filter默认只会给这类字段开放exact(精确匹配)能力,其他查找表达式(包括in、contains等)都会被直接忽略,所以你携带__in后缀的查询参数相当于没传,接口直接返回全量数据。 - 请求参数的下划线数量错误
你请求中写的brand___name__in用了3个下划线分隔brand和name,而Django跨外键查询的标准语法是双下划线,正确的参数前缀应为brand__name。
修复步骤:
- 修改
ProductFilter的字段配置,将列表形式改为字典形式,显式声明每个字段支持的查找表达式:
class ProductFilter(filters.FilterSet): variants__price = filters.RangeFilter() class Meta: model = Product fields = { 'brand__name': ['exact', 'in', 'icontains'], # 新增in查找支持 'variants__price': ['exact', 'range'], 'availability': ['exact'], 'slug': ['exact'], 'category__name': ['exact', 'in', 'icontains'], 'services': ['exact'], 'featured': ['exact'], 'best_seller': ['exact'], 'top_rated': ['exact'], }
- 调整请求参数格式,使用正确的双下划线分隔:
localhost/api/products?brand__name__in=lg,sony
修改后多值查询即可正常生效。
内容的提问来源于stack exchange,提问作者Reactoo
相关产品推荐
相关产品推荐

