Django - 每个不同状态的查询计数
Posted
技术标签:
【中文标题】Django - 每个不同状态的查询计数【英文标题】:Django - Query count of each distinct status 【发布时间】:2021-04-09 14:06:20 【问题描述】:我有一个模型 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
可以提供帮助。
【问题讨论】:
【参考方案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 - 每个不同状态的查询计数的主要内容,如果未能解决你的问题,请参考以下文章