Mil*_*ano 1 django postgresql django-orm django-queryset django-aggregation
我有一个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()
Run Code Online (Sandbox Code Playgroud)
我认为这aggregate会有所帮助。
是的,您可以与:
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。