Как я могу суммировать поля 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 }}
Вернуться на верх