如何在 Django 模型中建立 2 层深度反向关系?

How to go 2 layers deep reverse relations inside django models?

我使用单个用户模型进行身份验证并使用用户模型创建多个“类型”帐户。每种类型都有不同的仪表板,因此可以显示不同的内容。

Organization
-> Teacher
    -> Student

问 - 我想在组织帐户中列出教师及其对应的学生?这是一个 listView,所以我想知道如何使用尊崇关系列出组织帐户中特定教师下的所有学生?

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(
        Teacher, on_delete=models.CASCADE, related_name='student')
    ...

如果有任何关于如何改进现有模型架构的建议,我也想知道。

您可以像这样获取教师及其学生(在两次数据库点击中):

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}')

编辑:

您还可以 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')