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(...) или вставке строки непосредственно в БД.

Если вы хотите, чтобы значение по умолчанию применялось независимо ни от чего, вам нужно взглянуть на возможности, предоставляемые вашей системой БД

Вернуться на верх