Django ORM 查询执行简单的 ORDER BY 聚合

问题描述 投票:0回答:1

鉴于这个简单的表格,

class Payment(models.Model):
    paid_date = models.DateField("Paid on")
    amount = models.DecimalField(max_digits=7, decimal_places=2)

我想生成一个表格,按月生成所有费用的总和,例如:

总计
2023/11 200
2023/12 400

由于这需要从

paid_date
字段中提取年份和月份,我尝试这样做:

  1. 添加一个名为
    year_mo
    的新字段,该字段组合了
    paid_date
    字段中的年份和月份。
  2. 仅提取
    year_mo
    amount
    字段。
  3. 总结每个独特
    amount
    字段的所有
    year_mo

这是我尝试过的一个例子:

    exp_by_month = Payment.objects \
                          .annotate(year_mo=Trunc('paid_date', 'month')) \
                          .values('year_mo', 'amount') \
                          .annotate(Sum('amount'))

这似乎没有执行任何聚合,因为 Payments 表中每个 for 的结果都有一行。添加的

amount__sum
字段与
amount
相同。这看起来应该很容易,但我真的很挣扎。

django-orm
1个回答
0
投票

您可以向您的付款模型再添加一个字段

class Payment(models.Model):
    year_month = models.DateField()
    paid_date = models.DateField("Paid on")
    amount = models.DecimalField(max_digits=7, decimal_places=2)

当您创建模型实例时,如果您没有向

year_month
字段提供日期(日),则该日期将是该月的第一天,例如2024/05/01.

然后您可以汇总付款总额:

Payment.objects.values("year_month").annotate(monthly_payments=Sum("amount"))
© www.soinside.com 2019 - 2024. All rights reserved.