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

Django执行搜索查询时JSONField提示不支持name lookup报错如何解决

错误原因

你触发报错的核心原因是:

  • model__name 写法错误:model是JSONField类型,不是关联外键,Django会把__name识别为字段查找操作,JSONField本身没有name这个查找类型,直接抛出异常
  • JSONField不能直接使用__icontains对整个字段做模糊匹配,需要先指定要查询的JSON内部键名,再执行匹配操作

解决方案

你的所有JSON字段都统一使用data作为顶级键,按照Django JSONField的查询规则调整查询逻辑即可:

  1. 对于model字段:它的data对应值为字符串类型,直接访问model__data后加__icontains做模糊匹配
  2. 对于gtin_no、oem_no、tag字段:它们的data对应值为数组类型,同样通过字段名__data__icontains做模糊匹配,Django会自动遍历数组元素匹配内容
  3. 额外添加空值过滤逻辑,跳过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:06:04