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

Django JSONField模型查询无结果:如何实现关键词搜索?

问题根源与解决方案

你遇到的问题核心是手动用json.dumps()把字典序列化成字符串存入JSONField,导致数据库里存储的是带转义符的字符串而非原生JSON对象,Django的JSONField查询语法无法对字符串生效。


1. 修复数据存储逻辑

Django的JSONField会自动处理Python字典与JSON格式的转换,不需要手动调用json.dumps()。修改创建订单的代码:

CreateOrder = Order.objects.create(
    OrderData=OrderDataCreate,  # 直接传入字典,无需json.dumps()
)

修改后,数据库中的OrderData会存储为原生JSON对象,而非字符串格式。

2. 修复已存在的脏数据

对于已经存入数据库的字符串格式数据,需要批量转换为原生JSON。在Django Shell中执行以下代码:

import json
from your_app.models import Order  # 替换为你的app名称

# 遍历所有OrderData为字符串格式的记录
for order in Order.objects.filter(OrderData__startswith='"'):
    try:
        # 将字符串解析为字典
        json_data = json.loads(order.OrderData)
        order.OrderData = json_data
        order.save()
    except json.JSONDecodeError:
        # 处理解析失败的异常,可根据需求跳过或记录日志
        print(f"解析失败:订单ID {order.Order_ID}")

3. 正确的查询代码

数据修复完成后,两种查询方式均可正常工作:

方式一:使用Q对象+__contains

OrderData = Order.objects.all().order_by('-created_at')
if SearchQuery:
    SearchQuery = inpvalidator.anyname_validation(SearchQuery)
    search_filters = Q(OrderData__contains={'product_title': SearchQuery})
    OrderData = OrderData.filter(search_filters)
    print(f'Search Filtered=======>{OrderData.count()}')

方式二:直接通过键名模糊匹配

OrderData = Order.objects.all().order_by('-created_at')
if SearchQuery:
    SearchQuery = inpvalidator.anyname_validation(SearchQuery)
    OrderData = OrderData.filter(OrderData__product_title__icontains=SearchQuery)
    print(f'Search Filtered=======>{OrderData.count()}')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:00:12