在django rest框架中更新JSONField

时间:2016-04-17 18:45:44

标签: django postgresql django-rest-framework

我目前熟悉在django rest-framework中使用JSONField,但我找不到任何直接的方法来更新存储的json中的密钥。有许多方法可以过滤JSONField依赖于其内部密钥,但似乎无法更改,更新或删除已存储的JSONField中的密钥。但似乎postgres可以对json键进行一些修改,如this answer所解释的那样。

是否有任何能够对JSONField进行修改的功能。如果没有任何直接命令来执行此操作,那么实现JSONField修改的最佳方法是什么?

修改

作为一个例子,如果我有这样的模型:

class Thing(models.Model):
    name = models.CharField()
    properties = JSONField()

properties中,我存储了一个像这样的json:

{
"color" : "red",
"size" : "large",
"cost" : 1234
}

然后我想将颜色更改为"绿色"通过使用django命令。

5 个答案:

答案 0 :(得分:5)

thing = Thing.objects.get(name="...")
thing.properties['color'] = 'green'
thing.save()

答案 1 :(得分:1)

@tarasinf 和 @Vladius001 的 jsonb_set 方法也适用于 Django 的 Func expression

Thing.objects.update(
    properties=Func(
        F("properties"),
        Value(["color"]),
        Value("green", JSONField()),
        function="jsonb_set",
    )
)

答案 2 :(得分:0)

对于您的模型:

class Thing(models.Model):
    name = models.CharField()
    properties = JSONField()

如果您需要更新一堆条目,您可以执行以下操作:

Thing.objects.update(
    properties=RawSQL("jsonb_set(properties, '{color}', 'green', true)", [])
)

color: green 将被插入,如果不存在。

欢迎访问 PostgreSQL docs,了解有关 jsonb_set 的更多信息。

答案 3 :(得分:0)

下一个语法对我有用,

  • Django==2.2.19
  • Postgres==12.0.6
from django.db.models.expressions import RawSQL
Thing.objects.update(properties=RawSQL("""jsonb_set(properties, \'{"name"}\',\'"name value"\', true)""", []))

答案 4 :(得分:-2)

您可以在此处找到更好的解决方案 https://django-postgres-extensions.readthedocs.io/en/latest/json.html