2016-06-08 2 views
1

Я хочу как-то присоединиться к группе со всеми моими разрешениями. Я хочу запросить ВСЕ разрешения, а для каждого запроса разрешения - логический индикатор, если у него есть группа. Так предположим, этотDjango присоединиться к запросу для разрешений и группы?

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

Permission.objects.all(). Аннотацию (группа имеет это ??)

group.permissions.all() 

не поможет, так как я хочу, чтобы запросить все разрешения.

UPDATE: Четкого объяснения:
Пусть мое разрешение таблица (значения рк): 1, 2, 3 - всего три строки.
Групповой стол: одна группа с pk = 1.
Таблица групповых разрешений (много для многих): группа с pk 1, имеет разрешение 1,2 (так что две строки)

Я хочу показать все разрешения с индикатором рядом с ним, есть ли у группы Это. Таким образом, в нашем случае я должен получить:
1 Правда
2 Правды
3 Ложных

Причины группа не имеет разрешения с рк = 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

Забыл сказать, что это действительно работает. Просто вопрос - для чего нужен Макс? – user3599803

+0

Причина без макс, я получаю дублированные результаты .. Я не понимаю, почему – user3599803

+0

'annotate' вызывает' group by', в этом случае на основе 'Permission.pk' (если есть предыдущие' значения () 'call, он будет группировать по этим столбцам. При отладке сложных запросов полезно посмотреть на сгенерированный SQL, например: 'print Permission.objects.annotate (...). Query' – zsepi

Смежные вопросы