django - جانغو أورم الشروح: مجموعة الأكثر شيوعا من كيريسيت المستخدم




django-models orm (2)

لدي كيريسيت من نموذج auth.User.

أريد أن أعرف: أي المجموعات هي التي تحتوي على معظم هؤلاء المستخدمين.

مثال: لدي ثلاث مجموعات، مع هؤلاء المستخدمين:

  • g1: u1 u2 u3 u4
  • g2: u1 u2
  • g3: u1 u4 u5 u6
  • g4: u5 u6 u7

وسر-كيريست: u1 u2 u3

النتيجة (حساب الأعضاء الموجودين في كيريسيت وسر-كيريسيت):

  • g1: العد 3
  • g2: العد 2
  • g3: العد 1
  • g4: العد 0

كيف يمكنني الحصول على كيريسيت مشروح من طراز مجموعة هذا مع دجانغو 1.8؟

حالة الاستخدام

عرض عدد الأعضاء الذين لديهم "x" في اسم المستخدم لكل مجموعة.

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 ليس لديها أعضاء مطابقة، ولكن يجب أن يكون في كريسيت المشروح.


في جانغو يمكننا تجميع بعض الكائن استنادا إلى values ويمكننا تطبيق annotation على نتيجة التجميع. قراءة هذا الرابط سوف يشرح كيفية استخدام القيم والتعليق.

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

إذا كنت بحاجة إلى المستخدمين فقط ضمن المجموعة يعني:

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

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())),
)




orm