问题描述
我有一个模型 Model
有 Model.status
字段。 status
字段的值可以是 draft
、active
或 cancelled
。
是否可以根据对象的状态获取所有对象的计数?我宁愿在一个查询中做到这一点,而不是这样:
Model.objects.filter(status='draft').count()
Model.objects.filter(status='active').count()
Model.objects.filter(status='cancelled').count()
我认为 aggregate
可以提供帮助。
解决方法
是的,您可以使用:
from django.db.models import Count
Model.objects.values('status').annotate(
count=Count('pk')
).order_by('count')
这将返回 QuerSet
的字典:
<QuerySet [
{'status': 'active','count': 25 },{'status': 'cancelled','count': 14 },{'status': 'draft','count': 13 }
]>
然而,这将不会列出数据库中不存在 Model
的状态。
或者您可以使用带有 filter=
的聚合:
from django.db.models import Count,Q
Model.objects.aggregate(
nactive=Count('pk',filter=Q(status='active')),ncancelled=Count('pk',filter=Q(status='cancelled')),ndraft=Count('pk',filter=Q(status='draft'))
)
这将返回一个字典:
{
'nactive': 25,'ncancelled': 25,'ndraft': 13
}
找不到 Model
的项目将作为 None
返回。