Django orm计数只返回一个结果

Django orm计数只返回一个结果,django,django-models,django-orm,Django,Django Models,Django Orm,我将此表命名为Orders,每个订单都有一个状态,我希望根据状态计算结果: status_counts = Order.objects.all( ).values( 'status' ).annotate( pending = Count( Case( When( status__exact = Order.STATUS_PENDING, then = F( 'pk' ) ) ) ), completed = Count( Case( Wh

我将此表命名为
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,'failed':2278,'failed':0,{'completed':0,'pending':0,'failed':0,'reversed':0,'353,'status':3},

我有没有办法得到这个结果:


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

检查以下各项是否有效:

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, ...}

检查以下工作是否正常:

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, ...}

除非这是在大容量请求中使用的,否则我绝对建议在一系列不同的
count
查询中使用。它虽然效率不高,但更容易推理,无论是谁维护这段代码,还是下一步阅读它——即使是你,一个月后——都肯定能够更容易地解释它。除非在大容量请求中使用它,否则我绝对建议在一系列不同的
count
查询中这样做。虽然效率不高,但推理起来要容易得多,不管是谁维护这段代码,还是下一步阅读它——即使是你,一个月后——肯定能够更容易地解释它。