【问题标题】:Django: TruncYear and annotate/aggregate?Django:TruncYear 和注释/聚合?
【发布时间】:2018-04-26 11:02:49
【问题描述】:

我有以下型号:

class Order(models.Model):
    placed_at = models.DateTimeField()
    amount = models.DecimalField()

我想知道每年amount 的总数。运行时:

Order.objects.annotate(year=TruncYear('placed_at'))
             .values('year')
             .annotate(total=Sum('amount'))

Django 返回一个查询集,其中包含数据库中每条记录的年份和总数(所以total == amount)。使用聚合时:

Order.objects.annotate(year=TruncYear('placed_at'))
             .values('year')
             .aggregate(total=Sum('amount'))

Django 返回总计 ({'total': Decimal('72822.41')})。我正在寻找的结果应该是每年分解的总数。喜欢

<QuerySet [{'year': 2016, 'total': Decimal('20000.00')},
           {'year': 2017, 'total': Decimal('30000.00')}]

知道我在这里俯瞰什么吗?

【问题讨论】:

    标签: python django


    【解决方案1】:

    我敢打赌,您在Order 模型上指定了默认排序,would cause 就是您所看到的行为。查询时需要清除默认排序:

    Order.objects.annotate(year=TruncYear('placed_at'))
             .values('year')
             .annotate(total=Sum('amount')).order_by()
    

    注意order_by()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-26
      • 2016-11-18
      • 2017-06-12
      • 2021-01-20
      • 2011-07-07
      • 2023-03-29
      • 2018-07-06
      • 2019-09-30
      相关资源
      最近更新 更多