【问题标题】:Django orm count return only one resultDjango orm count 只返回一个结果
【发布时间】:2016-06-16 01:42:42
【问题描述】:

我有一张名为Orders 的表,每个订单都有一个状态,我想根据状态计算结果:

status_counts = Order.objects.all( ).values( 'status' ).annotate(
    pending = Count( Case(
        When( status__exact = Order.STATUS_PENDING, then = F( 'pk' ) )
    ) ),
    completed = Count( Case(
        When( status__exact = Order.STATUS_COMPLETED, then = F( 'pk' ) )
    ) ),
    failed = Count( Case(
        When( status__exact = Order.STATUS_FAILED, then = F( 'pk' ) )
    ) ),
    reversed = Count( Case(
        When( status__exact = Order.STATUS_REVERSED, then = F( 'pk' ) )
    ) ) )

我的查询的问题是它为每个状态返回一个结果:

[{'completed': 4571, 'pending': 0, 'failed': 0, 'reversed': 0, 'status': 0}, {'completed': 0, 'pending': 2278, 'failed': 0, 'reversed': 0, 'status': 1}, {'completed': 0, 'pending': 0, 'failed': 0, 'reversed': 353, 'status': 3}]

有没有办法可以得到这个结果:

{'completed': 4571, 'pending': 2278, 'failed': 0, 'reversed': 353, 'status': 0}

【问题讨论】:

  • 除非在大量请求中使用它,否则我绝对建议在一系列不同的count 查询中执行此操作。它效率不高,但更容易推理,无论谁维护或什至接下来阅读它 - 即使是你,一个月后 - 肯定能够更容易地解释它。

标签: django django-models django-orm


【解决方案1】:

检查以下是否有效:

dict(Order.objects.all().values('status').annotate(scount=Count('status')).values_list('status', 'scount'))

分解

# get all available statuses
qs = Order.objects.all().values('status')

# annotate each status with count
qs = qs.annotate(scount=Count('status'))
# [{'status': 'completed', 'scount': 4571}, {'status': 'pending', 'scount': 2278} ...]

# now get only what you want in `values_list`
qs = qs.values_list('status', 'scount')
# [('completed', 4571), ('pending', 2278), ...]

# and then convert it to dict
result = dict(qs)
# {'completed': 4571, 'pending': 2278, ...}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2018-02-13
    • 1970-01-01
    相关资源
    最近更新 更多