Обновить всю таблицу, чтобы применить новый пользовательский метод save () - PullRequest
0 голосов
/ 25 февраля 2020

Я только что внес изменение в модель с атрибутом оценки, чтобы иметь новый save ()

def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
    if self.id:
        if self.best_rank <= self.rank_level:
            self.best_rank = self.rank_level

    return super(model, self).save(force_insert=False, force_update=False,
                                         using=using, update_fields=update_fields)

, теперь я хочу обновить предыдущие записи, чтобы применить это изменение, т.е. изменить best_rank с 0 (по умолчанию).

Я пытался

qs = model.objects.filter(best_rank=0).exclude(rank_level=0)
for e in qs:
    e.save()

проблема в том, что у меня 800000 записей в этой таблице.

Там должно быть, лучше, чем тот, который я пытаюсь

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Django имеет функцию F(), которая используется в наборах запросов для получения существующих полей в записи:

model.objects.filter(best_rank__lte=F('rank_level')).update(best_rank=F('rank_level'))

Этот код должен обновлять ваши поля без циклов for

1 голос
/ 25 февраля 2020

Вы должны использовать django-bulk-update python модуль

pip install django-bulk-update

views.py

from bulk_update.helper import bulk_update

qs = model.objects.filter(best_rank=0).exclude(rank_level=0)
bulk_update(qs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...