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

如何使用Django ORM的.update()方法批量更新JsonField中的多个键值?

用Django的.update()批量更新JSONField的多个键值对

你可以通过两种方式用.update()一次性更新JSONField里的多个键值对,全程不会触发save()方法,也就不会触发post_save信号:

方法1:嵌套使用jsonb_set

利用PostgreSQL的jsonb_set支持链式调用的特性,在第一个更新的结果上继续更新第二个键:

from django.db.models import F, Value, Func
from django.db.models.fields.json import JSONField

Question.filter(id="123").update(
    extra_data=Func(
        # 先更新test键为"no"
        Func(
            F("extra_data"),
            Value(["test"]),
            Value("no", JSONField()),
            function="jsonb_set"
        ),
        # 再在上述结果基础上更新prod键为"yes"
        Value(["prod"]),
        Value("yes", JSONField()),
        function="jsonb_set"
    )
)

方法2:使用jsonb_update(PostgreSQL 12+适用)

如果你的PostgreSQL版本在12及以上,可以用jsonb_update直接传入一个包含所有要更新键值对的JSON对象,一次性完成批量更新:

from django.db.models import F, Value, Func
from django.db.models.fields.json import JSONField

Question.filter(id="123").update(
    extra_data=Func(
        F("extra_data"),
        # 传入要更新的键值对集合
        Value({"test": "no", "prod": "yes"}, JSONField()),
        function="jsonb_update"
    )
)

注意事项

  • 这两种方法仅适用于PostgreSQL数据库,因为Django的JSONField在PostgreSQL下默认映射为jsonb类型,依赖PostgreSQL的JSON函数。
  • .update()是直接操作数据库的批量更新方法,不会调用模型的save()方法,自然不会触发post_save信号,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 12:03:18