Как я могу суммировать поля Django Models по датам и выводить итоговые значения на основе текущего месяца и года
Я новичок в python Django framework и хотел бы, чтобы кто-нибудь помог мне с некоторым куском кода, над которым я бьюсь уже несколько часов. У меня есть модель расходов с полями даты и суммы среди прочих, и я хочу вычислить общую сумму за текущий месяц и отобразить в шаблоне 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 %}
Результат моего кода выше - отображение месяцев дат из Модели расходов на шаблоне. Ваша любезная помощь была бы очень кстати. Спасибо
Похоже, что вы просто не использовали усеченные поля в своем вызове values
.
В соответствии с этим, вы можете использовать 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 %}
EDIT:
Если вам нужен только текущий месяц и год, просто отфильтруйте его и выполните агрегирование, например:
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 }}