如何在 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 反向 FK 查找在 CBV 中显示子模型的实例
数据的查,改,删django orm中如何创建表关系django请求生命周期流程图路由层无名有名分组反向解析