2016-03-08 13 views
7

Tôi có một QuerySet của mô hình auth.User.Chú thích ORM Django: Nhóm truy vấn người dùng phổ biến nhất

Tôi muốn biết: Nhóm nào là nhóm chứa nhiều người dùng nhất.

Ví dụ: Tôi có ba nhóm, với những người dùng:

  • g1: u2 u1 u3 u4
  • g2: u1 u2
  • g3: u4 u1 U5 U6
  • g4: U6 u5 U7

người dùng QuerySet: u1 u2 u3

quả (đếm các thành viên, đều trong cùng đưa người dùng QuerySet):

  • g1: đếm 3
  • g2: đếm 2
  • g3: đếm 1
  • g4: đếm 0

thế nào thế nào tôi có thể nhận được một QuerySet chú thích của mô hình Nhóm này với Django 1.8?

sử dụng Case

Hiện có bao nhiêu thành viên với "x" trong tên người dùng mỗi nhóm có.

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; 

Cập nhật

Nhóm g4 không có thành viên phù hợp, nhưng nó phải ở trong QuerySet chú thích.

Trả lời

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

Rất hay, câu trả lời của bạn hoạt động. SQL kết quả: 'SELECT" auth_group "." Id "," auth_group "." Name ", COUNT (TRƯỜNG HỢP KHI" auth_user_groups "." User_id "IN (SELECT U0." Id "FROM" auth_user "U0 WHERE U0." tên người dùng ":: văn bản 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

Trong Django, chúng tôi có thể nhóm một số đối tượng dựa trên values và chúng tôi có thể áp dụng annotation trên kết quả nhóm. Đọc bài này link nó sẽ giải thích cách sử dụng các giá trị và chú thích.

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

Nếu bạn cần phải chỉ những người dùng thuộc nhóm có nghĩa là:

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

Kết quả sẽ là một queryset chú thích của trường hợp nhóm. Đầu vào là một queryset của các cá thể người dùng. Tôi không thể thấy điều này trong ví dụ của bạn. – 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()]) 

Hope câu trả lời này là chấp nhận được ..

+0

Có, điều này làm việc, nhưng tôi thích vòng trong SQL đến vòng trong python. "Làm thế nào tôi có thể nhận được một QuerySet chú thích của mô hình Nhóm này với Django 1.8?" – guettli

Các vấn đề liên quan