用于分组和计数的django queryset

时间:2017-07-18 06:29:13

标签: python django django-queryset

Details.objects.all()

Dept      Gender   Shift
Software  Male     Day
Software2 Female   Night

我想要的是json像{“Gender”:“Male”,“count”:2}使用queryset。 count是特定部门中男性和女性的数量。

我对djnago很新,并试过这个

Details.objects.values("Gender").annotate(count=Count("Gender")).order_by("Shift") 

我得到的地方

[{'count': 3, 'Gender': u'Female'}, {'count': 1, 'Gender': u'Male'}, {'count': 3, 'Gender': u'Female'}, {'count': 3, 'Gender': u'Male'}] 

这两个部门......我一次只想要一个部门(Software / Software2)。请帮忙:)谢谢。

2 个答案:

答案 0 :(得分:1)

以下查询将gender和department作为输入,并在JSON中将计数作为输出。

day_male_count = Details.objects.filter(gender='Male', department='Software', shift='Day').count()

night_male_count = Details.objects.filter(gender='Male', department='Software', shift='Night').count()

我觉得这可能不是你要问的,是吗?

答案 1 :(得分:0)

Django ORM使用注释和聚合很难做到这一点所以我选择了更纯粹的python方法。

from collections import Counter
d = list(Details.objects.values_list('Dept', 'Gender', 'Shift'))
response = [i + (c[i],) for i in Counter(d)]

我们正在做的是将行作为元组拉出,然后将它们传递给python Counter,它返回一个类似dict的对象,其中键是原始元组,值是对的数量的计数元组出现。

这给出了:

[
    ('software1', 'male', 'night', 2), 
    ('software1', 'female', 'day', 1), 
    ('software2', 'male', 'day', 1), 
    ('software2', 'female', 'day', 1), 
    ('software1', 'female', 'night', 1)
]

为了证明我们运行的结果:

final = [{'Dept': i[0], 'Gender': i[1], 'Shift': i[2], 'Count': i[3]} for i in response]

希望我帮助过。