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
相关产品推荐
相关产品推荐

