【问题标题】:django ORM problem - Annotate and aggregate return inconsistent valuesdjango ORM 问题 - 注释和聚合返回不一致的值
【发布时间】:2020-01-03 12:09:15
【问题描述】:

我发现aggregate()annotate() 不返回相同值的设置...我真的很困惑。

我有以下型号:

class Invoice(models.Model):
    pass

class InvoiceItem(models.Model):
    invoice = models.ForeignKey(Invoice, related_name="items")
    amount = models.PositiveIntegerField(null=False, blank=False, default=1)
    price = models.DecimalField(max_digits=10, decimal_places=2, null=False, blank=False, default=0)
    begin = models.DateField(null=True, blank=True)

当我想获得一段时间内的总收入时,我有以下查询:

revenue = Invoice.objects.annotate(
               first_date=Min('items__begin')).filter(
               first_date__range=[start_date, end_date]).aggregate(
               revenue=Sum(F('items__amount') * F('items__price'),               
                           output_field=FloatField()))['revenue']

我尝试对annotate() 做同样的事情,只是为了验证结果:

revenue_list = Invoice.objects.annotate(
                  first_date=Min('items__begin')).filter(
                  first_date__range=[start_date, end_date]).annotate(
                  revenue=Sum(F('items__amount') * F('items__price'),               
                              output_field=FloatField()))

当我现在循环遍历元素并手动总结 revenue 时,我得到的值与 revenue 不同。

有什么想法吗?不幸的是,聚合后您无法再检查原始查询...

谢谢!

PS:我用 SQL 手动检查了这些值。 annotate是对的……

【问题讨论】:

    标签: django django-orm django-aggregation


    【解决方案1】:

    好的,我找到了解决方案。 distinct()values() 不起作用,但将乘法移动到第二个 annotate

    revenue =  Invoice.objects.annotate(
                   first_date=Min('items__begin')).filter(
                   first_date__range=[start_date, end_date]).annotate(
                   revenue_invoice=Sum(F('items__amount') * F('items__price'),
                                       output_field=FloatField())).aggregate(
                   revenue=Sum('revenue_invoice', output_field=FloatField()))['revenue']
    

    也许这对其他人有帮助...

    【讨论】:

      猜你喜欢
      • 2021-01-20
      • 2019-06-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2016-11-18
      • 2016-01-30
      • 2015-12-29
      • 2013-10-08
      相关资源
      最近更新 更多