我正试图为许多师生关系树立榜样。教师和学生都是课堂用户的对象(我编辑了一些不相关的字段)。我在理解这段关系应该如何运作方面遇到了问题。
基本上,我想要做的事情是
u1 = User.objects.get(pk=<student pk>)
u1.teachers.all()
u2 = User.objects.get(pk=<teacher pk>)
u2.students.all()有可能吗?
在阅读了一些文档和教程之后,我是如何定义用户类和StudentTeacher关系的:
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是我的应用程序的名称):
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'.发布于 2019-10-03 17:18:00
你在这里的关系太多了。您不需要StudentTeacher模型,只需要一个ManyToManyField。
class User(AbstractUser):
students = models.ManyToManyField('self', symmetrical=False, related_name='teachers')现在,您的代码与您提供的代码完全相同。
https://stackoverflow.com/questions/58223661
复制相似问题