2016-03-08 10 views
7

私はauth.UserモデルのQuerySetを持っています。Django ORM注釈:ユーザクエリセットの最も一般的なグループ

知っておきたいこと:これらのユーザーを最も多く含むグループはどれですか。

例:

  • G1:U1、U2、U3、U4
  • G2:U1、U2
  • G3:U1〜U4、U5、U6
  • G4:U5、U6私は、これらのユーザーとの三つのグループを、持っていますU7

ユーザークエリセット:U1、U2 U3の

結果(カウント与えられたユーザークエリセットであるメンバー):

  • G1:3
  • G2を数える:1つの
  • G4を数える:0

方法を数える2

  • G3を数えますモデルの注釈付きQuerySetをDjango 1.8でグループ化できますか?

    ユースケース

    各グループが持っているどのように多くのメンバーのユーザー名に「×」と表示します。

    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; 
    

    更新

    グループg4が一致するメンバーを持っていませんが、それは注釈付きクエリセットにする必要があります。

  • 答えて

    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

    あなたの答えはうまくいきます。 ID: "auth_group"、 "auth_group"、 "auth_group"、 "auth_user_groups"、 "user_id" IN(SELECT U0。 "id" FROM "auth_user" U0 WHERE U0。 ID "=" auth_user_groups "。" group_id ")GROUP BY" auth_user_groups "(" auth_groups "。" id "=" auth_user_groups ")。 auth_group "。"id"、 "auth_group"。 "name" ORDER BY "user_cnt" DESC' – guettli

    0

    Djangoでは、valuesに基づいてオブジェクトをグループ化でき、グループ化結果にannotationを適用できます。 このlinkを読んで、値と注釈の使い方を説明します。

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

    あなたはグループの下で、ユーザーは意味だけでする必要がある場合:

    この答えが許容される
    group = Group.objects.annotate(Count("user__pk")) 
    
    +0

    結果は、注釈付きのクエリセットでなければなりませんグループインスタンス。入力は、ユーザーインスタンスのクエリセットです。私はあなたの例でこれを見ることができません。 – 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()]) 
    

    ・ホープ..

    +0

    はい、これはうまくいきますが、PythonでループするSQLのループが好きです。 "モデルの注釈付きQuerySetをDjango 1.8でグループ化するにはどうすればいいですか?" – guettli

    関連する問題