当前位置: 首页 > 知识库问答 >
问题:

如何让奥林更新()嵌套在一个 JSON 字段中的多个值?

堵睿范
2023-03-14

我在PostgreSQL上有一个Django JSONField,它包含一个字典,我想使用queryset。update()以使用值批量更新多个键。我知道如何对JSONField中的一个值(以及通常的多个字段)执行此操作:

from django.db.models import Func, Value, CharField, FloatField, F, IntegerField

class JSONBSet(Func):
    """
    Update the value of a JSONField for a specific key.
    """
    function = 'JSONB_SET'
    arity = 4
    output_field = CharField()

    def __init__(self, field, path, value, create: bool = True):
        path = Value('{{{0}}}'.format(','.join(path)))
        create = Value(create)
        super().__init__(field, path, value, create)

这似乎有效 - 根据我的另一个问题有一些差距 - 就像这样:

# This example sets the 'nestedkey' to numeric 199.
queryset.update(inputs=JSONBSet('inputs', ['nestedkey_1'], Value("199"), False))

但是如果我现在想在同一个输入中更新第二个nestedkey_2,我显然不能像这样两次使用输入参数:

queryset.update(inputs=JSONBSet(...'nestedkey_1'...), inputs=JSONBSet(...'nestedkey_2'...)

有办法做到这一点吗?

共有1个答案

罗业
2023-03-14

我终于想通了。Postgres有jsonb运算符“||”,可以与Django一起使用,如下所示:

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)
#
# Form a dict with the key-value pair we want to overwrite.
#
tmp = JSONObject(**{'inputs-0-value': Value("199999"), 'inputs-1-value': Value("123456")})
#
# Overwrite 'inputs-0-value' and 'inputs-1-value' using the dict.
#
queryset.update(inputs=JSONBUpdate('inputs', tmp))

简单!

FWIW,其他数据库似乎有一个或多或少的标准化函数,其名称类似于jsonb_update我怀疑它做了类似于“||”的事情。

 类似资料:
  • 问题内容: 我在某些列中有一个带有嵌套表的oracle表。现在,我需要能够更新每个嵌套表,主表中每个记录中的所有记录。这是如何完成的?我尝试过的任何一种方法,都会收到有关无法在该视图上执行更新或单行子查询返回多个行的错误。 这是一个例子来说明。我可以运行这样的更新: 但是在这种情况下,table子句是在单行的单个嵌套表上执行的。如果您不只是想要等于2的entity.uidn,将如何执行这样的更新?

  • 您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,了解正确的语法....

  • 我有多个json文件,其中包含需要合并的关系数据,每个文件都有一个带有commonkey的记录,这是所有文件中的公共键,在下面的示例中,a0,a1是公共键。值是多个键的嵌套字典,如Key1、key2等,如下所示,我需要合并多个json文件并获得如dboutput.json所示的输出,文件名在合并操作中充当索引。这样的问题是一个相关的问题,它合并了丢失的信息,但在我的情况下,我不希望任何更新替换现有

  • 问题内容: 我正在尝试计算具有唯一嵌套字段值的文档(以及文档本身)。看起来获得唯一文档有效。但是,当我尝试执行的请求时,出现如下错误: 禁止:org.elasticsearch.client.ResponseException:方法[POST],主机 [http:// localhost:9200] ,URI [/ package / _count?ignore_throttled = true&

  • 问题内容: 我基本上只是试图更新表中的多个值。最好的方法是什么?这是当前代码: 我要包含的另一个更新是: 谢谢! 问题答案: 用逗号分隔添加多列: 但是,您没有在清理输入内容??这意味着任何随机的黑客都可能破坏您的数据库。看到这个问题:用PHP清理用户输入的最佳方法是什么? 另外,样式是数字还是字符串?我假设一个字符串,所以需要用引号引起来。

  • 我想实现,让我们说温度单位转换器。我想使用AndroidMVVM和数据绑定来做到这一点,但我不知道如何。我有一个片段,它由三个编辑文本字段组成:摄氏度,华氏度,开尔文。更改其中之一后,其余部分应自动更新。在没有数据绑定的情况下,我将 TextWatcher 设置为每个字段,并在 onTextChanged 中执行所有验证和转换逻辑,并设置其他字段的值。在之前文本更改中,我删除了其他字段的侦听器,并