Django 4.2中如何查询JSONField列表所有元素的指定字段?
解决Django 4.2中JSONField列表元素的字段匹配查询问题
场景说明
你的Practitioner模型中specialties是存储对象列表的JSONField,需要查询列表中任意元素的specialty字段匹配指定值的记录,而非仅查询固定索引位置的元素。
解决方案
1. 基于PostgreSQL数据库(推荐,支持完整JSONB操作)
Django在PostgreSQL下的JSONField实际为JSONB类型,支持__elem_match查找,用于匹配列表中存在至少一个元素满足指定条件:
from django.db.models import Q # 查询specialties列表中存在元素的specialty等于"Anesthesiology"的记录 practitioners = Practitioner.objects.filter( specialties__elem_match=Q(specialty="Anesthesiology") )
2. 基于MySQL数据库
MySQL的JSON函数支持JSON_CONTAINS,可以指定路径匹配列表中的元素:
# 使用原生SQL查询,替换myapp_practitioner为你的实际表名(通常是应用名_模型名小写) practitioners = Practitioner.objects.raw(''' SELECT * FROM myapp_practitioner WHERE JSON_CONTAINS(specialties, '{"specialty": "Anesthesiology"}', '$[*]') ''')
3. 基于SQLite数据库
SQLite的JSON支持有限,可通过json_extract提取所有specialty字段值后匹配(注意:若specialty值包含目标字符串会误匹配,仅适用于简单场景):
# 使用原生SQL查询,替换myapp_practitioner为你的实际表名 practitioners = Practitioner.objects.raw(''' SELECT * FROM myapp_practitioner WHERE json_extract(specialties, '$[*].specialty') LIKE '%Anesthesiology%' ''')
常见误区
你尝试的specialties__each__specialty、specialties__any__specialty等写法无效,是因为这些是Django针对ArrayField的查找语法,并不适用于JSONField存储的列表结构。
内容的提问来源于stack exchange,提问作者Hossein Sayyedmousavi
相关产品推荐
相关产品推荐

