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'),
)