如何编写Django/PostgreSQL查询语句检索嵌套JSON数组?
正确的Django/PostgreSQL查询写法
要查询communications数组中存在name为john或erin的Draft实例,你需要修正ORM的查询语法——Django中没有__*__这种写法,正确的实现方式有两种:
方法一:使用Q对象结合JSON数组包含查询
这是最简洁的ORM写法,利用PostgreSQL JSONB的@>操作符(Django通过__contains映射):
from django.db.models import Q # 构造查询条件:匹配包含指定name对象的communications数组 query = Q(data__communications__contains=[{'name': 'john'}]) | Q(data__communications__contains=[{'name': 'erin'}]) # 执行查询并统计数量 count = Draft.objects.filter(query).count()
方法二:使用原生SQL查询
如果你更倾向于直接用PostgreSQL的JSON语法,也可以用原生查询:
count = Draft.objects.raw(""" SELECT * FROM draft WHERE data->'communications' @> '[{"name": "john"}]' OR data->'communications' @> '[{"name": "erin"}]' """).count()
这两种方法都能正确返回DRAFT1和DRAFT2对应的记录,因为它们分别满足communications数组中存在name为john或erin的元素。
内容的提问来源于stack exchange,提问作者Kamilski81
相关产品推荐
相关产品推荐

