2016-03-08 15 views
7

Mam zestaw kwerendy modelu auth.User.Adnotacje Django ORM: najczęstsza grupa zapytań użytkowników

Chcę wiedzieć: które grupy zawierają najwięcej tych użytkowników.

Przykład: trzy grupy, z tych użytkowników:

  • G1: u1 u2 u3 u4
  • G2: u1 u2
  • G3 U1 U4 U5 U6
  • G4: U5 U6 u7

użytkownika QuerySet: u1 u2 u3

Wynik (liczenie członków, które są w danym User-queryset):

  • g1 count 3
  • g2: Ilość 2
  • G3: 1 Liczba
  • G4 count 0

Jak Czy mogę uzyskać anonimowy QuerySet z modelu Group to z Django 1.8?

Use Case

Pokaż jak wielu członków "X" w nazwie użytkownika Każda grupa ma.

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; 

Aktualizacja

Grupa g4 ma członków dopasowania, ale powinna być w queryset adnotacjami.

Odpowiedz

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

Dobrze, twoja odpowiedź działa. Wynikowy SQL: "SELECT" auth_group "." Id "," auth_group "." Name ", COUNT (CASE WHEN" auth_user_groups "." User_id "IN (SELECT U0." Id "FROM" auth_user "U0 WHERE U0." username ":: text LIKE testfoobar%) THEN 1 ELSE NULL END) AS" user_cnt "OD" auth_group "LEFT OUTER DOŁĄCZ" 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

W Django możemy zgrupować obiekt na podstawie values i możemy zastosować annotation w wyniku grupowania. Przeczytaj tę link, która wyjaśni, jak korzystać z wartości i adnotacji.

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

Jeśli trzeba tylko użytkownicy w grupie oznacza:

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

Wynik powinien być odnotowany w queryset wystąpienia grupowe. Dane wejściowe to zestaw zapytań dla wystąpień użytkowników. Nie widzę tego w twoim przykładzie. – 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()]) 

Nadzieja ta odpowiedź jest do przyjęcia ..

+0

Tak, to działa, ale wolę pętle w SQL na pętle w pythonie. "W jaki sposób mogę uzyskać anonimowy zestaw kwerend grupy modelu z Django 1.8?" – guettli

Powiązane problemy