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

Django REST Framework自定义FilterSet的__in多值查询不生效如何解决?

问题原因及解决方法

核心问题有两个:

  • 过滤类ProductFilter的字段配置未显式开放__in查找权限
    你当前在Meta.fields中直接以列表形式声明过滤字段,django-filter默认只会给这类字段开放exact(精确匹配)能力,其他查找表达式(包括in、contains等)都会被直接忽略,所以你携带__in后缀的查询参数相当于没传,接口直接返回全量数据。
  • 请求参数的下划线数量错误
    你请求中写的brand___name__in用了3个下划线分隔brand和name,而Django跨外键查询的标准语法是双下划线,正确的参数前缀应为brand__name。

修复步骤:

  1. 修改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'],
      }
  1. 调整请求参数格式,使用正确的双下划线分隔:
    localhost/api/products?brand__name__in=lg,sony

修改后多值查询即可正常生效。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:15:07