Как сделать обратные отношения на 2 слоя глубже внутри моделей django?

Я использую единую модель User для аутентификации и создаю несколько учетных записей "типа" с помощью модели User. У каждого типа своя приборная панель, поэтому нужно показывать разные вещи.

Organization
-> Teacher
    -> Student

Q - Я хочу перечислить преподавателей и соответствующих им студентов, когда нахожусь внутри учетной записи организации? Это listView, поэтому я хочу знать, как я могу использовать отношения revere, чтобы перечислить всех студентов под определенными преподавателями из учетной записи организации?

class User(AbstractUser):
    ...


class Organization(models.Model):
    user_id = models.OneToOneField(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='superAdmin')
    ...

class Teacher(models.Model):
    user_id = models.OneToOneField(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='faculty')
    super_admin_id = models.ForeignKey(
        SuperAdmin, on_delete=models.CASCADE, related_name='faculty')
    ...


class Student(models.Model):
    user_id = models.OneToOneField(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='user')
    faculty_id = models.ForeignKey(
        Faculty, on_delete=models.CASCADE, related_name='student')
    ...

Если есть какие-либо советы о том, как я могу улучшить существующую схему модели, я хотел бы узнать и это.

Вы можете получить учителей вместе с их учениками (в двух db-хитах) следующим образом:

teachers = Teacher.objects.filter(
    user_id__superAdmin=request.user.superAdmin
).prefetch_related('student')

for teacher in teachers:
    print(f'Teacher: {teacher.pk}')
    for student in teacher.student.all():
        print(f'Student: {student.pk}')

EDIT:

Вы также можете annotate на каждого преподавателя количество студентов, закрепленных за ним, таким образом:

teachers = Teacher.objects.filter(
    user_id__superAdmin=request.user.superAdmin
).annotate(num_students=Count('student'))

for teacher in teachers:
    print(f'Teacher {teacher.pk} has {teacher.num_students} students')
Вернуться на верх