如何在django中执行内连接

时间:2017-08-26 16:10:49

标签: python django postgresql inner-join

判刑: select * from auth_permission left join auth_group_permissions on (auth_group_permissions.permission_id = auth_permission.id) 如何在django中使用queryset我不明白内部联接如何在查询集中工作

在默认django auth的模型中

我已经这样做了:

permiso = Permission.objects.all().select_related()
...: for x in permiso:
...:     print(x.group_set.all().query)

并在每个循环中看到:

SELECT "auth_group"."id", "auth_group"."name" FROM "auth_group" INNER JOIN "auth_group_permissions" ON ("auth_group"."id" = "auth_group_permissions"."group_id") WHERE "auth_group_permissions"."permission_id" = 1255

2 个答案:

答案 0 :(得分:2)

您可以按prefetch_related

检索所有组元素和权限
permissions = Permission.objects.prefetch_related('group_set').all()
for perm in permissions:
   group = perm.group_set.all()

答案 1 :(得分:-1)

在Django中进行开发时,通常不会考虑要执行的SQL查询。在您的情况下,如果您查看身份验证应用的model definitions,则会发现Group模型的permissions字段类型为ManyToMany。即使在Group模型中定义了字段,您也可以按相反的顺序执行(检查this)。因此,为了列出所有权限,并为每个权限指明它们是什么组,您可以执行以下操作:

for perm in Permission.objects.all():
    groups = perm.group_set.all()
    # Do something with groups