Таблица суммарных расходов по годам и месяцам Django

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

Получился queryset с суммами по месяцам, как красиво достать суммы за каждый год? Я сделал, но получился монстр на 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)```
Вернуться на верх