鉴于这个简单的表格,
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
字段中提取年份和月份,我尝试这样做:
year_mo
的新字段,该字段组合了 paid_date
字段中的年份和月份。year_mo
和 amount
字段。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
相同。这看起来应该很容易,但我真的很挣扎。
您可以向您的付款模型再添加一个字段
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"))