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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:47:03