2016-06-08 64 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