Django - ForeignKey Add Users Value As Default
Я хочу реализовать модель оценок в моем Django WebApp. Эта модель оценок имеет 3 ForeignKeys: студент, предмет и школьный класс студента. Есть ли способ установить значение этого поля по умолчанию на student.klasse (которое уже является полем в модели ученика).
models.py
class Person(AbstractUser): # called the model Person since they can be teacher or student
klasse = models.ForeignKey(SchoolClass, on_delete=models.CASCADE, blank=True, null=True)
class Test(models.Model):
student = models.ForeignKey(Person, on_delete=models.CASCADE, blank=True, null=True)
subject = models.ForeignKey(Subject, on_delete=models.CASCADE, blank=True, null=True)
school_class = models.ForeignKey(SchoolClass, on_delete=models.CASCADE, default=student.klasse_id, blank=True, null=True)
При попытке выполнить миграцию выдает эту ошибку:
school_class = models.ForeignKey(SchoolClass, on_delete=models.CASCADE, default=student.klasse_id, blank=True, null=True)
AttributeError: 'ForeignKey' object has no attribute 'klasse_id'
Вы не можете сделать это вот так.
Этот код выполняется на уровне класса, student
является объектом ForeignKey
. Это отличается от экземпляра Test
, где my_test.student
является объектом типа Person
Для достижения того, что вы пытаетесь сделать, я бы переопределил функцию save() модели Test
class Test(models.Model)
# Fields
...
def save(self, *args, **kwargs):
if not self.school_class and self.student:
self.school_class = self.student.klass
return super().save(*args, **kwargs)
Только учтите, что этот код будет выполняться только при выполнении my_test.save()
или Test.objects.create(...)
.
Значение по умолчанию не будет применяться при вызове Test.objects.update(...)
, Test.objects.bulk_create(...)
или вставке строки непосредственно в БД.
Если вы хотите, чтобы значение по умолчанию применялось независимо ни от чего, вам нужно взглянуть на возможности, предоставляемые вашей системой БД