Джанго Студент-Учитель Много-Много отношений - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь смоделировать отношения между учителем и учеником. И учителя, и ученики являются объектами класса Users (я отредактировал некоторые несвязанные поля). У меня проблемы с пониманием того, как должны работать отношения.

В принципе, я хочу иметь возможность сделать что-то вроде

u1 = User.objects.get(pk=<student pk>)
u1.teachers.all()

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

Возможно ли это?

Послечитая некоторые документы и руководства, я определил класс User и отношение 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'.

1 Ответ

0 голосов
/ 03 октября 2019

У вас здесь слишком много отношений. Вам не нужна модель StudentTeacher, и вам нужен только один ManyToManyField.

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

Теперь ваш код работает точно так же, как вы дали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...