首页 > 解决方案 > 如何按日期汇总 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 年唯一的当前月份。您的善意帮助会有很大帮助。谢谢

标签: pythondjangodjango-templatesdjango-queryset

解决方案


看来您只是没有在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 }}

推荐阅读