Django ORM如何筛选JSONField嵌套数组中EmailAddress对应的value值
Django ORM过滤JSON数组字段的实现方法
结论
该需求完全可以通过Django ORM原生功能实现,不需要额外编写原生SQL。
实现代码
# 过滤目标:邮箱为指定值的MyModel记录 target_email = "michael@hiyield.co.uk" # 过滤语句 queryset = MyModel.objects.filter( about__contains=[{"name": "EmailAddress", "value": target_email}] )
原理解释
- Django 3.1及以上版本对
JSONField提供了原生的包含查询(contains)支持,针对数组类型的JSON值,contains查询会校验数组中是否至少存在一个元素完全匹配传入的结构 - 上述代码中传入的
[{"name": "EmailAddress", "value": target_email}]会被Django解析为:查询about数组是否包含一个对象,该对象的name属性值为EmailAddress,且value属性值为指定的目标邮箱,和需求完全匹配 - 该方法不依赖
EmailAddress元素在数组中的固定位置,无论它在数组的第几顺位都可以被正确匹配
注意事项
- 该语法仅适用于Django 3.1及以上版本,更低版本的Django如果使用PostgreSQL作为数据库,可替换使用
django.contrib.postgres.fields.JSONField,用法完全一致 - 若数据量较大,可给
about字段创建GIN索引大幅提升该类JSON查询的性能(仅PostgreSQL支持)
内容的提问来源于stack exchange,提问作者Micheal J. Roberts
相关产品推荐
相关产品推荐

