Django ORM bulk_update
Я застрял на этой задаче. У меня есть модель Professor и мне нужно обновить ее из 2 запросов, но у меня 6 запросов в моей БД.
from django.db import models
class Professor(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
age = models.IntegerField(default=18)
Моя функция.
def update_professor_first_names():
first_name_updates = [(1, 'freddie'), (2, 'mady'), (3, 'hady'), (4, 'michael'), (5, 'rose')]
tmp = []
for prof_id, new_first_name in first_name_updates:
prof = Professor.objects.get(id=prof_id)
prof.first_name = new_first_name
tmp.append(prof)
Professor.objects.bulk_update(tmp, ['first_name'])
Пожалуйста, дайте мне несколько советов.
прямо сейчас вы выполняете get на каждый ID, что генерирует 5 запросов, затем один для обновления, что составляет 6 запросов.
Вы можете использовать оператор __in со всеми идентификаторами, чтобы запустить один запрос для получения профессоров, которых вы хотите обновить, а затем запустить массовое обновление после присвоения имен, всего два запроса:
id_set = [id for id, first_name in first_name_updates]
profs_to_update = Professor.objects.filter(id__in=id_set)
for prof in profs_to_update:
prof.first_name = next(first_name for id, first_name in first_name_updates if id == prof.id)
Professor.objects.bulk_update(profs_to_update, ['first_name'])