如何使用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
相关产品推荐
相关产品推荐

