Объект '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'])