为什么注释会生成重复的条目?

时间:2016-06-01 07:43:59

标签: django django-queryset

给出以下代码:

payments = Payment.objects.filter(
        customer=self.customer,
        created_at__gte=kwargs['start_date'],
        created_at__lte=kwargs['end_date']
    ).order_by('-date')

balance = payments.values('currency').annotate(Sum('amount'))

> print(balance)
> [{'amount__sum': Decimal('0.00'), 'currency': 'USD'},
   {'amount__sum': Decimal('0.00'), 'currency': 'USD'},
   {'amount__sum': Decimal('9000.00'), 'currency': 'SEK'},
   {'amount__sum': Decimal('45000.00'), 'currency': 'EUR'},
   {'amount__sum': Decimal('11385.00'), 'currency': 'SEK'}]

此客户的付款清单:

> print(payments)
> ('-1487.50', 'USD')
('1487.50', 'USD')
('-3663.72', 'USD')
('3663.72', 'USD')
('15000.00', 'EUR')
('9000.00', 'SEK')
('30000.00', 'EUR')
('9865.00', 'SEK')
('1520.00', 'SEK')

如果我使用汇总,我会得到总和,但对于所有货币而言,这不是我想要的。我必须能够分成货币。

{'amount__sum': Decimal('65385.00')}

我正在尝试通过客户分组和按货币汇总来提取付款。然而,所发生的是它并没有对一些值进行求和而是复制它们。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

导致这种情况的是order_byorder_by中提到的字段将隐含地成为该组的一部分,否则根据docs on aggregation and order_by定义为values中提到的字段。

看看是否

Payment.objects.filter(
        customer=self.customer,
        created_at__gte=kwargs['start_date'],
        created_at__lte=kwargs['end_date']
    ).values('currency').annotate(Sum('amount'))

没有给出你正在寻找的答案。

这也是由Payment.Meta.ordering上设置的默认排序引起的。如果你这样做,你将需要明确地取消订单:

Payment.objects.filter(
        customer=self.customer,
        created_at__gte=kwargs['start_date'],
        created_at__lte=kwargs['end_date']
    ).order_by().values('currency').annotate(Sum('amount'))