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

时间:2016-03-08 09:37:31

标签: django django-models orm

我有一个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

结果(计算给定用户查询集中的成员):

  • g1:count 3
  • g2:count 2
  • g3:count 1
  • g4:count 0

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

使用案例

显示有多少成员使用" x"在每个组的用户名中。

SQL

g4

更新

{php}没有匹配的成员,但它应该在带注释的QuerySet中。

3 个答案:

答案 0 :(得分: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())),
)

答案 1 :(得分: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()])

希望这个答案是可以接受的。

答案 2 :(得分:0)

在Django中,我们可以根据values对某个对象进行分组,我们可以在分组结果上应用annotation。 阅读此link,它将解释如何使用值和注释。

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

如果只需要群组下的用户,则表示:

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