2017-08-26 53 views
1

采取了一句: select * from auth_permission left join auth_group_permissions on (auth_group_permissions.permission_id = auth_permission.id) 我可怎么办在Django与查询集我不明白是怎么内部联接,在默认的Django身份验证的模型查询集如何执行内部在Django加入

作品

我已经做到了这一点:

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 
+0

检索所有组元素,并允许你不要加入Django,Django会为你加入。所以请添加你的模型并解释你想要存档的内容。 –

+0

我正在尝试权限和组模型以获得这些权限的所有权限以获得具有各个权限的组 我有或多或少的4组和200多个权限 – NEFEGAGO

回答

2

您可以通过prefetch_related

permissions = Permission.objects.prefetch_related('group_set').all() 
for perm in permissions: 
    group = perm.group_set.all() 
+0

@NEFEGAGO:通常建议不要问类似的[重复问题](https://stackoverflow.com/questions/45889424/optimize-code-in-django-view-manytomany- as-matrix),并且如果它不会损害现有答案,则可以改进原始内容。然而,这个解决方案比Python更简单,比我的简单,甚至通过最少数量的SQL也是如此有效。 – hynekcer

-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 
+0

但问题是查询变得太慢当我想要在模板中呈现它时 – NEFEGAGO