Django группировка по месяцам с возможными нулями
Я создаю диаграмму для анализа данных. Мне нужно сгруппировать подсчет по месяцам за весь год.
Моя модель:
Class Application:
reference,
created_at
Из вышесказанного следует, что мне нужно подсчитать количество заявок за каждый месяц текущего года. И с помощью текущего запроса я получаю все данные, но я не получаю данные за месяцы, по которым нет данных:
Мой запрос:
queryset = Application.objects.filter(user=user).annotate(month=TruncMonth('created_at')).values('month').annotate(_applications=Count('id')).order_by('month')
Например, если у меня есть данные за месяц Jan and Feb, то вышеприведенный запрос выдает данные только за этот месяц, но мне нужно, чтобы данные содержали "0" для всех месяцев, по которым нет данных:
Если March не имеет данных средств, результат должен быть "0" для этого месяца. Как это сделать?
Вы можете вручную создать набор данных, используя результаты запроса
queryset = Application.objects.filter(user=user).annotate(
month=TruncMonth('created_at')).values('month').annotate(
_applications=Count('id')).order_by('month')
applications_by_month = {
m['month'].month: m['_applications'] for m in queryset
}
dataset = []
year = 2021
for month in range(1, 13):
dataset.append({
"month": datetime.date(year=year, month=month, day=1),
"applications": applications_by_month.get(month, 0)
})
print(dataset)
Выход
[{'month': datetime.date(2021, 1, 1), 'applications': 0},
{'month': datetime.date(2021, 2, 1), 'applications': 0},
{'month': datetime.date(2021, 3, 1), 'applications': 1},
{'month': datetime.date(2021, 4, 1), 'applications': 0},
{'month': datetime.date(2021, 5, 1), 'applications': 0},
{'month': datetime.date(2021, 6, 1), 'applications': 1},
{'month': datetime.date(2021, 7, 1), 'applications': 0},
{'month': datetime.date(2021, 8, 1), 'applications': 0},
{'month': datetime.date(2021, 9, 1), 'applications': 0},
{'month': datetime.date(2021, 10, 1), 'applications': 0},
{'month': datetime.date(2021, 11, 1), 'applications': 0},
{'month': datetime.date(2021, 12, 1), 'applications': 0}]