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

Django Queryset:用注解和F表达式遍历JSONField嵌套对象数组

解决Django ORM提取JSONField数组中所有元素属性的问题

针对Django 4.2 + PostgreSQL环境下的需求,直接使用F()表达式无法实现提取JSON数组中所有元素的指定属性,需要借助PostgreSQL的JSON函数,通过Django ORM的Func类封装实现,无需离线遍历或原生SQL。

问题原因

  • F("members__name"):Django ORM的F表达式不支持批量提取JSON数组中所有元素的属性,仅能处理单个JSON对象的属性,因此返回null。
  • F("members__0__name"):这种写法仅能定位数组的单个索引元素,只能获取第一个元素的name值,无法覆盖所有元素。

解决方案

利用PostgreSQL的jsonb_path_query_array函数(PostgreSQL 12+支持),该函数可通过JSONPath表达式直接从JSON对象中提取指定路径的所有值并返回数组。通过Django的Func类封装这个SQL函数,即可在ORM中使用。

代码实现

  1. 导入必要的类:
from django.db.models import Func, F
from django.db import models
  1. 定义封装jsonb_path_query_array的自定义Func类:
class JsonPathArrayExtract(Func):
    function = 'jsonb_path_query_array'
    # 模板中使用JSONPath表达式$.members[*].name提取所有members元素的name字段
    template = "%(function)s(%(expressions)s, '$.members[*].name')"
    output_field = models.JSONField()
  1. 在QuerySet中使用该自定义Func进行注解:
# 假设你的JSONField字段名为my_json
results = list(MyModel.objects.annotate(
    member_names=JsonPathArrayExtract(F('my_json'))
).values('member_names', 'other_data'))

执行后返回的结果中,member_names字段即为所需的字符串数组,格式完全符合预期。

内容的提问来源于stack exchange,提问作者Marko Andrijevic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:48:24