Django执行搜索查询时JSONField提示不支持name lookup报错如何解决
错误原因
你触发报错的核心原因是:
model__name写法错误:model是JSONField类型,不是关联外键,Django会把__name识别为字段查找操作,JSONField本身没有name这个查找类型,直接抛出异常- JSONField不能直接使用
__icontains对整个字段做模糊匹配,需要先指定要查询的JSON内部键名,再执行匹配操作
解决方案
你的所有JSON字段都统一使用data作为顶级键,按照Django JSONField的查询规则调整查询逻辑即可:
- 对于
model字段:它的data对应值为字符串类型,直接访问model__data后加__icontains做模糊匹配 - 对于
gtin_no、oem_no、tag字段:它们的data对应值为数组类型,同样通过字段名__data__icontains做模糊匹配,Django会自动遍历数组元素匹配内容 - 额外添加空值过滤逻辑,跳过
data值为["None"]的无效数据
修正后的查询代码如下:
query = request.GET.get('search') if query: product_list = product_list.filter( Q(product_name__icontains=query) | Q(brand__brand_name__icontains=query) | # 修正JSON字段查询逻辑 Q(model__data__icontains=query) | Q(gtin_no__data__icontains=query) | Q(oem_no__data__icontains=query) | Q(tag__data__icontains=query) # 过滤掉JSON字段data为["None"]的无效记录 ).exclude( Q(model__data=["None"]) | Q(gtin_no__data=["None"]) | Q(oem_no__data=["None"]) | Q(tag__data=["None"]) )
注意事项
- 该写法兼容Django 3.1及以上版本,支持PostgreSQL、MySQL 5.7+、SQLite 3.38.0+ 等主流数据库
- 如果需要更高的查询性能,可针对JSON字段的
data键建立GIN索引,大幅提升大数量级下的模糊匹配速度
内容的提问来源于stack exchange,提问作者ibrahim demet
相关产品推荐
相关产品推荐

