Объект 'QuerySet' не имеет атрибута 'pk' в "bulk_update"

У меня есть модель профессора и мне нужно "bulk_update". Я должен сделать это в 2 запросах из моей БД. Но у меня возникает исключение (объект "QuerySet" не имеет атрибута "pk"). Если я использую get, у меня возникает другое исключение (get() вернул более одного профессора).

Моя модель.

 class Professor(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    age = models.IntegerField(default=18)
    class Meta:
        indexes = [models.Index(fields=['first_name'])]

Мой код

def update_professor_first_names(first_name_updates: List[NameUpdate]):
    prof_id = [id for id, name in first_name_updates]
    prof = Professor.objects.filter(id__in=prof_id)
    tmp = []
    for prof_id, new_first_name in first_name_updates:
        prof.first_name = new_first_name
        tmp.append(prof)
    Professor.objects.bulk_update(tmp, ['first_name'])

Можете ли вы дать мне несколько советов по этому поводу?

Ваш prof - это QuerySet из Professor, а не один Professor, поэтому писать prof.first_name = new_first_name бессмысленно, и это также приведет к тому, что tmp будет списком из одних и тех же QuerySet, повторенных несколько раз.

Вы должны найти объект Professor и присвоить его соответствующим образом, так:

def update_professor_first_names(first_name_updates: List[NameUpdate]):
    prof_id = [id for id, name in first_name_updates]
    profs = {p.id: p for p in Professor.objects.filter(id__in=prof_id)}
    tmp = []
    for prof_id, new_first_name in first_name_updates:
        prof = profs[prof_id]
        prof.first_name = new_first_name
        tmp.append(prof)
    Professor.objects.bulk_update(tmp, ['first_name'])
Вернуться на верх