Django ORM注释:最常见的用户查询集

gue*_*tli 7 django orm django-models

我有一个auth.User模型的QuerySet.

我想知道:哪些组是包含大多数这些用户的组.

示例:我有三个组,这些用户:

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

User-QuerySet:u1 u2 u3

结果(计算给定User-Queryset中的成员):

  • g1:数3
  • g2:计数2
  • g3:计数1
  • g4:计数0

如何使用Django 1.8获取模型Group的带注释的QuerySet?

用例

显示每个组的用户名中包含"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;
Run Code Online (Sandbox Code Playgroud)

更新

g4没有匹配的成员,但它应该在带注释的QuerySet中.

vsd*_*vsd 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())),
)
Run Code Online (Sandbox Code Playgroud)