在Django Rest框架中更新JSONField

Moh*_*miz 5 django postgresql django-rest-framework

我目前对在django rest-framework中使用JSONField很熟悉,但是我找不到更新存储json中密钥的任何直接方法。过滤JSONField的方法有很多,取决于它的内部键,但是似乎没有办法从已存储的JSONField中更改,更新或删除键。但是似乎postgres可以对json键做一些修改,如这个答案所解释。

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

编辑:

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

class Thing(models.Model):
    name = models.CharField()
    properties = JSONField()
Run Code Online (Sandbox Code Playgroud)

properties我存储这样的json:

{
"color" : "red",
"size" : "large",
"cost" : 1234
}
Run Code Online (Sandbox Code Playgroud)

然后,我想使用django命令将颜色更改为“绿色”。

小智 21

@tarasinf 和 @Vladius001 的方法jsonb_set也适用于 Django 的Func 表达式

from django.db.models import F, Func, Value, JSONField

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

  • 请注意,**更新方法会立即提交**,因此事务回滚将不起作用。至少这是我的经验。 (4认同)

ser*_*erg 6

thing = Thing.objects.get(name="...")
thing.properties['color'] = 'green'
thing.save()
Run Code Online (Sandbox Code Playgroud)

  • 有没有办法用“.update()”来做到这一点? (4认同)