我目前熟悉在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命令。
答案 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)
下一个语法对我有用,
from django.db.models.expressions import RawSQL
Thing.objects.update(properties=RawSQL("""jsonb_set(properties, \'{"name"}\',\'"name value"\', true)""", []))
答案 4 :(得分:-2)