如何在Django ORM中更新嵌套在JSONField内的多个值?
问题出现的原因是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来研究这个问题。