Django - 查询每个不同状态的计数

问题描述

我有一个模型 ModelModel.status 字段。 status 字段的值可以是 draftactivecancelled

是否可以根据对象的状态获取所有对象的计数?我宁愿在一个查询中做到这一点,而不是这样:

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 返回。