Таблица с итоговыми сводками по годам-месяцам Django

У меня есть приложение для учета расходов, мне нужно сделать таблицу расходов по году и месяцу, у меня есть запрос типа: queryset.all().values_list('date__year', 'date__month').annotate(Sum('amount')).order_by('date__year', 'date__month')

У меня есть кверисет с суммами по месяцам, как мне получить суммы за каждый год? Я сделал это, но у меня получился монстр из 15 строк:

def get_per_year_month_summary(queryset) -> OrderedDict:
    years_months = OrderedDict()
    years = sorted(set(map(lambda x: x['year'], queryset
                           .annotate(year=ExtractYear('date')).values('year'))))
    for year in years:
        months = sorted(set(map(lambda x: x['month'], queryset
                                .filter(date__year=year)
                                .annotate(month=ExtractMonth('date'))
                                .values('month'))))
        total_year = queryset.filter(date__year=year).aggregate(Sum('amount'))['amount__sum']
        years_months[str(year)] = total_year
        for month in months:
            sum_month = \
                queryset.filter(date__year=year, date__month=month).aggregate(Sum('amount'))['amount__sum']
            years_months[f'{year}-{month}'] = sum_month
    return years_months

Модель:

class Expense(models.Model):  
    category = models.ForeignKey(Category, models.PROTECT, null=True, blank=True)
    name = models.CharField(max_length=50)
    amount = models.DecimalField(max_digits=8, decimal_places=2)
    date = models.DateField(default=datetime.date.today, db_index=True)
Вернуться на верх