如何在Django ORM中更新嵌套在JSONField内的多个值?

6 浏览
0 Comments

如何在Django ORM中更新嵌套在JSONField内的多个值?

我在PostgreSQL上有一个包含字典的Django JSONField,并且我想使用queryset.update()批量更新多个键的值。我知道如何在JSONField(以及通常情况下的多个字段)中更新一个值。这个方法似乎可以工作,但有一些问题,比如我之前提到的问题。例如,如果我想要在同一个inputs中更新第二个nestedkey_2,我显然不能像这样两次使用inputs参数。有没有办法做到这一点?

0
0 Comments

问题出现的原因是Django ORM中的update()方法无法直接更新JSONField字段中嵌套的多个值。而解决方法是使用Postgres的jsonb运算符"||",通过自定义JSONBUpdate类来实现更新多个值。

具体解决方法如下所示:

from django.db.models import Func
from django.db.models.functions import JSONObject
class JSONBUpdate(Func):
    def __init__(self, field, update):
        super().__init__(update)
        self.template = "{} || %(expressions)s".format(field)
# 构造一个包含要覆盖的键值对的字典
tmp = JSONObject(**{'inputs-0-value': Value("199999"), 'inputs-1-value': Value("123456")})
# 使用字典覆盖'inputs-0-value'和'inputs-1-value'字段的值
queryset.update(inputs=JSONBUpdate('inputs', tmp))

通过使用以上方法,可以解决Django ORM中update()无法更新JSONField字段中嵌套多个值的问题。这种方法在Postgres中使用jsonb运算符"||"来实现更新。其他数据库可能会有类似的函数,比如名为jsonb_update的函数。在这个问题的相关讨论中,还提到了一个支持多个数据库后端的草稿实现,可以在这里找到:github.com/django/django/pull/15422。同时,还参考了code.djangoproject.com/ticket/32519来研究这个问题。

0