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

Posted

技术标签:

【中文标题】Django - 每个不同状态的查询计数【英文标题】:Django - Query count of each distinct status 【发布时间】:2021-04-09 14:06:20 【问题描述】:

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

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

Model.objects.filter(status='draft').count()
Model.objects.filter(status='active').count()
Model.objects.filter(status='cancelled').count()

我认为aggregate 可以提供帮助。

【问题讨论】:

【参考方案1】:

是的,您可以使用:

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

【讨论】:

谢谢它的工作。 items for which it can not find a Model will be returned as None. - 状态字段是一个字符字段,而不是 FK,所以它应该总是找到一个模型。 @Milano:我的意思是,如果有 no 模型带有status='active',然后是 'nactive': None,那么例如你所有的Model 记录是可能的有status='draft',这样就没有项目处于活动/取消状态。

以上是关于Django - 每个不同状态的查询计数的主要内容,如果未能解决你的问题,请参考以下文章

查询以显示不同的组合,然后显示每个不同组合的计数

Django:结合来自两个过滤器查询的两个计数注释

django中列表列表的排名和计数元素

查询以查找累积同时减去其他计数

多个语句的 SQL 多次计数赢得不同的列

聚合查询从嵌套子文档中获取最新元素的计数