2016-06-08 38 views
1

我想以某种方式加入一个拥有我所有权限的组。 我想查询所有的权限,并为每个权限查询一个布尔指标,如果该组拥有它。 所以假设这Django加入查询权限和组?

group = Group.objects.get(pk=1) # specific group 

Permission.objects.all()。注释(集团拥有它?)

group.permissions.all() 

不会帮助,因为我要查询所有权限。

UPDATE: 清除解释:
假设我的权限表是(PK值):1,2,3 - 总三行。
组表:一组,pk = 1。
组的许可(多到多)表:用PK 1组,有权限1,2-(所以两行)

我想显示的所有权限,以在他们附近的指示符的组是否具有它。 所以在我们的情况下,我应该得到:
1真
2真
3个假

原因组没有与PK = 3许可。

回答

2

我觉得下面的查询会为你工作

from django.db.models import Case, When, BooleanField 

group_name = 'your group name' 
Permission.objects.annotate(
    has_perm=Max(Case(
     When(group__name=group_name, then=1), 
     default=0, 
     output_field=BooleanField() 
    )) 
).values_list('name', 'has_perm').order_by('has_perm') 

Conditional expressions在Django 1.8进行了介绍,并aggregation (annotate)也是有据可查的。

+0

忘了说这是行不通的。只是一个问题 - Max需要什么? – user3599803

+0

原因没有最大值,我得到重复结果..我不明白为什么 – user3599803

+0

'annotate'导致'group by',在这种情况下,基于'Permission.pk'(如果有一个先前的值( )'调用,它将按这些列进行分组)。在调试复杂查询时,查看生成的SQL很有帮助,例如:'print Permission.objects.annotate(...)。query' – zsepi