Таблица с итоговыми сводками по годам-месяцам 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)