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

如何在Django中合并两个JSONField字段且不执行查询集?

合并Django中两个JSONField字段的方案

要在Django ORM中合并两个JSONField(对应Postgres的jsonb类型)字段,且不触发查询集执行,你可以通过自定义表达式映射Postgres的||运算符实现,具体方案如下:

1. 自定义JSONB拼接函数

创建继承自django.db.models.Func的类,直接对应Postgres的jsonb拼接运算符:

from django.db.models import Func, JSONField

class JSONBConcat(Func):
    function = '||'
    output_field = JSONField()

2. 在ORM查询中使用

通过F()表达式引用目标字段,结合自定义的JSONBConcat构造拼接逻辑,比如用annotate生成合并后的字段:

from django.db.models import F

# 假设模型为MyModel,包含json_field1和json_field2两个JSONField字段
queryset = MyModel.objects.annotate(
    combined_json=JSONBConcat(F('json_field1'), F('json_field2'))
)

此时queryset仅构造查询逻辑,并未执行数据库查询,只有当你遍历结果或调用values()等方法时才会触发查询。

替代方案:使用ExpressionWrapper

若不想自定义Func类,也可直接用ExpressionWrapper拼接运算符:

from django.db.models import ExpressionWrapper, F, JSONField

queryset = MyModel.objects.annotate(
    combined_json=ExpressionWrapper(
        F('json_field1') || F('json_field2'),
        output_field=JSONField()
    )
)

不过自定义Func的方式在兼容性上更有保障。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:45:08