Обновление JSONField в Django
Допустим, у меня есть модель:
class Foo(Model):
bar = JSONField(...)
Я могу легко фильтровать по элементам bar
. Например,
Foo.objects.filter(bar__has_key="some_key").count()
даст мне количество Foo
объектов, которые имеют "some_key"
как ключ в их bar
поле.
Мой вопрос касается обновлений. Я пытался:
Foo.objects.exclude(bar__has_key="some_key").update(bar__some_key={"x": "y"})
чтобы установить значение по умолчанию там, где оно не установлено, но это дает мне
django.core.exceptions.FieldDoesNotExist: Foo has no field named 'bar__some_key'.
Я могу, конечно, сделать
objs = list(Foo.objects.exclude(bar__has_key="some_key"))
for obj in objs:
obj.bar["some_key"] = {"x": "y"}
Foo.objects.bulk_update(objs, ["bar"])
но мне интересно, можно ли это сделать без циклов (и генерации потенциально больших Foo
объектов в памяти), используя только QuerySet.update
.
Дополнительно мне было бы интересно, как убрать "some_key"
из всех объектов, у которых он есть. Итак, это:
objs = list(Foo.objects.filter(bar__has_key="some_key"))
for obj in objs:
del obj.bar["some_key"]
Foo.objects.bulk_update(objs, ["bar"])
но снова используя только QuerySet.update
.