python - 如何按日期汇总 Django 模型字段并根据当前月份和年份显示总计
问题描述
我是 python Django 框架的新手,我希望有人能帮助我解决一些我一直在努力解决几个小时的代码。我有一个包含日期和金额字段的支出模型,我想计算当月的总金额并使用上下文字典通过视图显示在 django 模板中。这是我的支出模型代码:
class Expenditure(models.Model):
amount = models.PositiveIntegerField(null=False)
date = models.DateField(auto_now_add=False, auto_now=False, null=False)
Views.py 代码在这里:
from django.db.models import Count, Sum
from django.db import connection
def index(request):
truncate_month = connection.ops.date_trunc_sql('month','day')
total_income = Income.objects.extra({'month': truncate_month}).values('date').annotate(Sum('amount'))
context = {
'total_income':total_income,
}
return render(request, 'dashboard/index.html', context)
这就是我试图在 Django 模板中显示当前月份和年份的总金额的方式。
{% for income in total_income %}
{{income.date}}{{income.amount}}
{% endfor %}
我上面代码的结果是在模板上显示来自支出模型的日期月份,而这是我期望的唯一输出结果:'Aug. 2021 年:仅 13,000' 因为 8 月是 2021 年唯一的当前月份。您的善意帮助会有很大帮助。谢谢
解决方案
看来您只是没有在values
通话中使用截断的字段。
与此一致,您可以使用 django 的TruncMonth
按月份进行注释和分组:
from django.db.models.functions import TruncMonth
total_income = Income.objects.annotate(month=TruncMonth('date')).values('month').annotate(total_amount=Sum('amount'))
context = {
'total_income': total_income,
}
然后在您的模板中,使用这些带注释的字段,如下所示:
{% for income in total_income %}
{{ income.month }} {{ income.total_amount }}
{% endfor %}
编辑:
如果您只在当前月份和年份需要它,只需对其进行过滤并运行如下聚合:
import datetime
now = datetime.datetime.now()
total_income = Income.objects.filter(
date__year=now.year, date__month=now.month
).aggregate(total_income=Sum('total_income'))['total_income']
context = {
'year': now.year,
'month': now.strftime('%B'),
'total_income': total_income,
}
在模板中,无需迭代任何内容:
{{ year }} - {{ month }} : {{ total_income }}