如何在 django 模型中进行 2 层深度反向关系?

Posted

技术标签:

【中文标题】如何在 django 模型中进行 2 层深度反向关系?【英文标题】:How to go 2 layers deep reverse relations inside django models? 【发布时间】:2021-11-07 17:39:19 【问题描述】:

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

Organization
-> Teacher
    -> Student

问 - 我想在组织帐户中列出教师及其对应的学生?它是一个 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(
        Teacher, on_delete=models.CASCADE, related_name='student')
    ...

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

【问题讨论】:

嗨!你能展示所有相关的模型吗?学生与老师有什么关系? @BrianD,学生与老师发生了关系。我的不好,我把老师模型的名字弄错了。修复它 【参考方案1】:

您可以像这样获取老师和他们的学生(在两个数据库中):

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

【讨论】:

这很好用。但我想要的是学生人数 确定已更新。你的问题确实是how would I use revere relations to *list* all the students under specific teachers 这就是我要找的。谢谢

以上是关于如何在 django 模型中进行 2 层深度反向关系?的主要内容,如果未能解决你的问题,请参考以下文章

Django 深度序列化 - 遵循反向外键约束

django之路由层

如何正确使用 Django 反向 FK 查找在 CBV 中显示子模型的实例

数据的查,改,删django orm中如何创建表关系django请求生命周期流程图路由层无名有名分组反向解析

数据的查,改,删django orm中如何创建表关系django请求生命周期流程图路由层无名有名分组反向解析

深度学习:神经网络中的前向传播和反向传播算法推导