【问题标题】:Django - Query count of each distinct statusDjango - 每个不同状态的查询计数
【发布时间】: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 可以提供帮助。

【问题讨论】:

    标签: django postgresql django-queryset django-orm django-aggregation


    【解决方案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',这样就没有项目处于活动/取消状态。
    猜你喜欢
    • 2015-01-08
    • 2017-03-07
    • 2016-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多