Python 为什么Case/When会对my values()的结果进行解组注释()查询?

Python 为什么Case/When会对my values()的结果进行解组注释()查询?,python,django,Python,Django,我有一个条件查询问题。我一直在阅读,似乎无法理解这一点 假设我有一个订单模型,我想要一个按用户分组的付款明细 以下是订单模型: class Order(models.Model): CASH = 'c' CARD = 'a' PAYMENT_TYPES = ( (CASH, 'Cash'), (CARD, 'Card'), ) user = models.ForeignKey(User, on_delete=mode

我有一个条件查询问题。我一直在阅读,似乎无法理解这一点

假设我有一个订单模型,我想要一个按用户分组的付款明细

以下是订单模型:

class Order(models.Model):    
    CASH = 'c'
    CARD = 'a'
    PAYMENT_TYPES = (
        (CASH, 'Cash'),
        (CARD, 'Card'),
    )
    user = models.ForeignKey(User, on_delete=models.PROTECT, null=True, blank=True)
    payment_type = models.CharField(max_length=1, choices=PAYMENT_TYPES)
    grand_total = models.DecimalField(max_digits=8, decimal_places=2)
下面是一个values()+annotate()查询,显示每个用户的总数:

query = Order.objects.values(
    'user'
).annotate(
    total=Sum('grand_total'),
)
迄今为止,结果良好:

User     Total
--------------
User 1   300
User 2   250
但是,当我向查询添加Case/when条件时:

query = Order.objects.values(
    'user'
).annotate(
    cash=Case(When(payment_type=Order.CASH, then=Sum('grand_total')), default=Value(0)),
    card=Case(When(payment_type=Order.CARD, then=Sum('grand_total')), default=Value(0)),
    total=Sum('grand_total'),
)
我得到的结果不是我想要的:

User     Cash      Card      Total
----------------------------------
User 1   300       0         300
User 2   200       0         200
User 2   0         50        50
User     Cash      Card      Total
----------------------------------
User 1   300       0         300
User 2   200       50        250
当然,这就是我想要的:

User     Cash      Card      Total
----------------------------------
User 1   300       0         300
User 2   200       0         200
User 2   0         50        50
User     Cash      Card      Total
----------------------------------
User 1   300       0         300
User 2   200       50        250
为什么通过values()给我提供的值撤消组时会出现这种情况


注意:Order模型没有默认的顺序,只是以防万一,在阅读使用values()时,我尝试将
.Order\u by()
.Order\u by('user')
添加到我的查询中,这并没有改变结果。

结果表明,我的聚合函数应该包装我的case语句,而不是相反

query = Order.objects.values(
    'user',
).annotate(
    cash=Sum(Case(When(payment_type=Order.CASH, then=F('grand_total')))),
    card=Sum(Case(When(payment_type=Order.CARD, then=F('grand_total')))),
    total=Sum('grand_total'),
)