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'])
Вернуться на верх