首页 > 解决方案 > 在两个用户模型之间创建关系

问题描述

我正在建立一个有教师和学生的网站。我使用默认的 Django 用户模型,最初忽略了教师并将我所有的用户视为学生。今天我开始尝试将我的用户分为教师和学生,并且遇到了很多困难。我显然缺少一些基础知识,并且在网上阅读了很多内容,但我在兜圈子。

一个老师可以有很多学生,一个学生可以有一个老师。

首先,我认为 Id 需要单独的学生和教师模型。所以现在每个人都是用户,我将为每个人附加一个学生或教师模型(这是马虎吗?)。

现在来说关系。我尝试在他们自己的模型中创建教师和学生之间的关系,但它没有奏效,所以我认为我需要一个单独的 TeacherStudentRelationship 类来保存这些关系。

到目前为止,这是我的实现:

class Student(models.Model):
    student = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.student.username}'

class Teacher(models.Model):
    teacher= models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.teacher.username}'

class TeacherStudentRelationship(models.Model):
    student = models.ForeignKey(User, on_delete=models.CASCADE)
    teacher = models.OneToOneField(User, on_delete=models.CASCADE)

这不会引发任何错误,尽管在 Django Admin 中我可以创建多个 TeacherStudentRelationship 实例并在多个实例中将学生分配给老师(应该只能将学生分配给老师一次)。即使关系是一对多的,我也只能在一个实例中将单个学生分配给单个老师。

我的实施也有问题。每次创建用户时,我都会触发一个信号,该信号会生成一个学生模型并将其与用户链接。当我有学生在我的网站上注册时,这很好,尽管这意味着我的管理员也需要一个学生模型(否则它会引发错误)。我还计划在 Django 管理面板中创建教师,但这也会导致问题,因为他们需要学生模型。你将如何实现这一点?

谢谢你。

标签: pythondjangodjango-modelsdjango-users

解决方案


ManyToMany您可以在教师模型中建立一个关系,而不是像这样建立一个单独的关系。像这样:

class Student(models.Model):
    student = models.OneToOneField(User, on_delete=models.CASCADE)

    def __str__(self):
        return f'{self.student.username}'

class Teacher(models.Model):
    teacher= models.OneToOneField(User, on_delete=models.CASCADE)
    students = models.ManyToManyField(Student)

这样,当您创建教师实例时就不需要创建新学生,反之亦然。

更新

从评论中,不幸的是,除非您在 django 中使用自定义用户模型,否则您无法删除信号。你可以这样尝试:

CHOICES = (('student', "Student"), ('teacher', "Teacher"))

class User(AbstractUser):
   user_type = models.CharField(choices=CHOICES, max_length=255)
   has_teacher = models.ForeignKey('self', null=True, default=None)

   REQUIRED_FIELDS = ['user_type', 'email']

然后,您可以在用户创建过程中定义它是什么类型的用户,因此您不需要信号。此外,您可以将学生和教师的身份验证数据存储在同一模型中。


推荐阅读