python - 在两个用户模型之间创建关系
问题描述
我正在建立一个有教师和学生的网站。我使用默认的 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 管理面板中创建教师,但这也会导致问题,因为他们需要学生模型。你将如何实现这一点?
谢谢你。
解决方案
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']
然后,您可以在用户创建过程中定义它是什么类型的用户,因此您不需要信号。此外,您可以将学生和教师的身份验证数据存储在同一模型中。
推荐阅读
- java - Leetcode - 检查 N 和它的双精度是否存在
- python - 如何组合和平均数据框矩阵中的值?
- python - Python:查找数组中第一个零实例的索引,如果没有找到返回无
- html - 使用 css 删除 div 和 table 之间的空间
- python - Python 请求包中带有 GET 请求的代理
- javascript - 当搜索栏退格为空时,如何让我的列表不显示?
- javascript - 通过 JavaScript 添加内容的 div 的宽度为 0
- python - 如何使用python从JSON中删除特定成员
- javascript - 在 TypeScript 中使用枚举指定类型的替代方法?
- powershell - Powershell替换一个文件夹中多个文件中的文本