2016-03-08 13 views
7

Ho un QuerySet del modello auth.User.Annotazioni ORG Django: gruppo più comune di user queryset

Voglio sapere: quali gruppi sono quelli che contengono la maggior parte di questi utenti.

Esempio: Ho tre gruppi, con questi utenti:

  • g1: u1 u2 u3 U4
  • g2: u2 u1
  • g3: u1 U4 U5 U6
  • g4: U6 u5 u7

User-QuerySet: u1 u2 u3

Risultato (conteggio i componenti che sono nel dato dall'utente Queryset):

  • g1: Numero 3
  • g2: conteggio 2
  • g3: COUNT 1
  • g4 Conteggio 0

Come posso ottenere un QuerySet con annotazioni del modello Raggrupparlo con Django 1.8?

Use Case

Visualizza quanti membri con "x" il nome utente ogni gruppo ha.

SQL

SELECT auth_group.id, auth_group.name, 
(SELECT COUNT(auth_user_groups.id) FROM auth_user_groups WHERE 
    auth_user_groups.group_id = auth_group.id AND 
    auth_user_groups.user_id IN (SELECT auth_user.id FROM auth_user WHERE username LIKE '%x%')) AS user_cnt 
FROM auth_group ORDER BY user_cnt DESC; 

Aggiornamento

Gruppo g4 non ha membri corrispondenti, ma dovrebbe essere in QuerySet annotato.

risposta

7
from django.db.expressions import Case, When 
from django.db.models import Count, IntegerField 

Group.objects.annotate(
    user_cnt=Count(Case(When(user__in=user_list, then=1), 
         output_field=IntegerField())), 
) 
+0

Bello, la tua risposta funziona. SQL risultante: "SELECT" auth_group "." Id "," auth_group "." Nome ", COUNT (CASO QUANDO" auth_user_groups "." User_id "IN (SELECT U0." Id "FROM" auth_user "U0 DOVE U0." username ": text LIKE testfoobar%) THEN 1 ELSE NULL END) AS" user_cnt "FROM" auth_group "LEFT OUTER JOIN" auth_user_groups "ON (" auth_group "." id "=" auth_user_groups "." group_id ") GROUP BY" auth_group"."id", "auth_group". "name" ORDER BY "user_cnt" DESC' – guettli

0

In Django possiamo raggruppare alcuni oggetti basati sullo values e possiamo applicare annotation sul risultato del raggruppamento. Leggi questo link spiegherà come utilizzare i valori e l'annotazione.

group = Group.objects.filter(id=XX).values("user").annotate(Count("user__pk")) 

Se è necessario solamente gli utenti sotto il gruppo significa:

group = Group.objects.annotate(Count("user__pk")) 
+0

Il risultato dovrebbe essere un set di query commentata di istanze di gruppo. L'input è un queryset di istanze utente. Non riesco a vederlo nel tuo esempio. – guettli

1
list_group = [] 
for grp in Group.objects.filter(id__in = [g1, g2, g3, g4]): 
    print grp, '---', User.objects.filter(id__in = [u1, u2, u3], groups = grp).count() 
    list_group([grp, User.objects.filter(id__in = [u1, u2, u3], groups = grp).count()]) 

speranza questa risposta è accettabile ..

+0

Sì, questo funziona, ma preferisco i loop in SQL ai loop in python. "Come posso ottenere un QuerySet annotato del modello Raggrupparlo con Django 1.8?" – guettli

Problemi correlati