Как сделать обратные отношения на 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')