为什么注释会生成重复的条目?
Why annotate generates duplicate entries?
给定以下代码:
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')}
我正在尝试通过客户分组和货币汇总来提取付款。然而,发生的事情是它不会对某些值求和,而是复制它们。有什么想法吗?
是 order_by
造成的。根据 docs on aggregation and order_by.
,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'))
给定以下代码:
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')}
我正在尝试通过客户分组和货币汇总来提取付款。然而,发生的事情是它不会对某些值求和,而是复制它们。有什么想法吗?
是 order_by
造成的。根据 docs on aggregation and order_by.
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'))