与模型的关系混淆

时间:2019-02-13 19:30:52

标签: python django

所以我试图创建以下类型的关系:

老师有很多学生,学生有很多老师,学生有很多(2)父母,父母有很多学生。

让我感到困惑的是,我试图通过AbstractUser的扩展将其存档。我对如何创建模型完全感到困惑。目前我有这个:

class User(AbstractUser):
    is_student = models.BooleanField(default=False)
    is_teacher = models.BooleanField(default=False)
    is_parent = models.BooleanField(default=False)

class Student(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    parent = models.ForeignKey(
        settings.AUTH_USER_MODEL, 
        on_delete=models.CASCADE,
        related_name='parents'
    )   

class Parent(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    student = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='students'
    )


class Teacher(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

    student = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='students'
    )

1 个答案:

答案 0 :(得分:4)

我认为您在这里使事情变得过于复杂。我认为不需要所有这些模型和一对一的关系。为什么不使用具有所有关系的简单用户模型?

class User(AbstractUser):
    students = models.ManyToManyField('self', related_name='teachers', symmetrical=False)
    children = models.ManyToManyField('self', related_name='parents', symmetrical=False)

注意,相关名称是反向关系;如果您是我的学生之一,我就是您的老师。您不需要为这些单独的字段。您确实需要将对称设置为False-否则Django会假设您是我的学生之一,我是您的学生之一,这显然是不对的。