Обновление 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.

Вернуться на верх