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

Mil*_*ano 1 django postgresql django-orm django-queryset django-aggregation

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

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

Model.objects.filter(status='draft').count()
Model.objects.filter(status='active').count()
Model.objects.filter(status='cancelled').count()
Run Code Online (Sandbox Code Playgroud)

我认为这aggregate会有所帮助。

Wil*_*sem 5

是的,您可以与:

from django.db.models import Count

Model.objects.values('status').annotate(
    count=Count('pk')
).order_by('count')
Run Code Online (Sandbox Code Playgroud)

这将返回一个QuerSet字典:

<QuerySet [
    {'status': 'active', 'count': 25 },
    {'status': 'cancelled', 'count': 14 },
    {'status': 'draft', 'count': 13 }
]>
Run Code Online (Sandbox Code Playgroud)

但是,这不会列出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'))
)
Run Code Online (Sandbox Code Playgroud)

这将返回一个字典:

{
    'nactive': 25,
    'ncancelled': 25,
    'ndraft': 13
}
Run Code Online (Sandbox Code Playgroud)

找不到 a 的项目Model将作为 返回None