Обновление значения ключа в JSONField()

Я пытаюсь обновить большое количество записей (3,2 миллиона).

Это моя модель:

class MyModel(models.Model):
    stats = JSONField()

Где статистика обычно сохраняется как:

{ 
   "my_old_key": [{"hey": "Hello World"}]
}

Я хочу обновить его так, чтобы только ключ менял свое значение, и конечная статистика выглядела следующим образом (хотя уже есть записи с "my_new_key", поэтому желательно их как-то пропустить):

{ 
   "my_new_key": [{"hey": "Hello World"}]
}

Я могу сделать это в Python, но это работает очень медленно... Я пробовал на ~10k записях с пакетным подходом из этой ссылки, чтобы набор запросов не был полностью загружен в память. Окончательное решение выглядело так:

def update_queryset(queryset) -> None:
    for stat in queryset:
        dictionary = stat.stats
        if "my_old_key" in dictionary:
            dictionary["my_new_key"] = dictionary.pop("my_old_key")
        stat.save()

Это действительно работает, но, к сожалению, работает слишком медленно :(.

Я думал о том, чтобы вообще не передавать его в python и работать только с базой данных примерно так, как предложено в этом ответе но не смог заставить его работать

Есть предложения, как я могу ускорить это / написать RawSQL / заставить подход jsonb_set работать?

def update_queryset(queryset) -> None:
    for stat in queryset:
        stat.stats["my_new_key"] = stat.stats.pop("my_old_key")
    MyModel.objects.bulk_update(queryset, ['stats'])
Вернуться на верх