首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django学生-教师ManyToMany关系

Django学生-教师ManyToMany关系
EN

Stack Overflow用户
提问于 2019-10-03 16:51:01
回答 1查看 694关注 0票数 0

我正试图为许多师生关系树立榜样。教师和学生都是课堂用户的对象(我编辑了一些不相关的字段)。我在理解这段关系应该如何运作方面遇到了问题。

基本上,我想要做的事情是

代码语言:javascript
复制
u1 = User.objects.get(pk=<student pk>)
u1.teachers.all()

u2 = User.objects.get(pk=<teacher pk>)
u2.students.all()

有可能吗?

在阅读了一些文档和教程之后,我是如何定义用户类和StudentTeacher关系的:

代码语言:javascript
复制
class User(AbstractUser):
    is_student = models.BooleanField('student status', default=False)
    is_teacher = models.BooleanField('teacher status', default=False)
    teachers = models.ManyToManyField('self', through="StudentTeacher", through_fields=('student', 'teacher'), symmetrical=False)
    students = models.ManyToManyField('self', through="StudentTeacher", through_fields=('teacher', 'student'), symmetrical=False)

class StudentTeacher(models.Model):
    teacher = models.ForeignKey(User, related_name='students', on_delete=models.CASCADE, limit_choices_to={'is_teacher': True})
    student = models.ForeignKey(User, related_name='teachers', on_delete=models.CASCADE, limit_choices_to={'is_student': True})

当我试图生成迁移时,会发生这样的情况(wiscom是我的应用程序的名称):

代码语言:javascript
复制
wiscom.StudentTeacher.student: (fields.E302) Reverse accessor for 'StudentTeacher.student' clashes with field name 'User.teachers'.
    HINT: Rename field 'User.teachers', or add/change a related_name argument to the definition for field 'StudentTeacher.student'.
wiscom.StudentTeacher.student: (fields.E303) Reverse query name for 'StudentTeacher.student' clashes with field name 'User.teachers'.
    HINT: Rename field 'User.teachers', or add/change a related_name argument to the definition for field 'StudentTeacher.student'.
wiscom.StudentTeacher.teacher: (fields.E302) Reverse accessor for 'StudentTeacher.teacher' clashes with field name 'User.students'.
    HINT: Rename field 'User.students', or add/change a related_name argument to the definition for field 'StudentTeacher.teacher'.
wiscom.StudentTeacher.teacher: (fields.E303) Reverse query name for 'StudentTeacher.teacher' clashes with field name 'User.students'.
    HINT: Rename field 'User.students', or add/change a related_name argument to the definition for field 'StudentTeacher.teacher'.
wiscom.User.students: (fields.E304) Reverse accessor for 'User.students' clashes with reverse accessor for 'User.teachers'.
    HINT: Add or change a related_name argument to the definition for 'User.students' or 'User.teachers'.
wiscom.User.teachers: (fields.E304) Reverse accessor for 'User.teachers' clashes with reverse accessor for 'User.students'.
    HINT: Add or change a related_name argument to the definition for 'User.teachers' or 'User.students'.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-03 17:18:00

你在这里的关系太多了。您不需要StudentTeacher模型,只需要一个ManyToManyField。

代码语言:javascript
复制
class User(AbstractUser):
    students = models.ManyToManyField('self', symmetrical=False, related_name='teachers')

现在,您的代码与您提供的代码完全相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58223661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档