Таблица суммарных расходов по годам и месяцам 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)```