Есть ли способ группировать аннотированные значения в другие группировки в Django
У меня есть модель, которая хранит почасовые данные.
class HourlyData(models.Model):
value = models.FloatField()
record_time = models.DateTimeField()
Эти данные были собраны за 3 месяца, и я хочу иметь возможность группировать эти данные в месячные данные и иметь их в этом формате.
data = [{
month:'2022-01',
days_count: 25,
total_value=1000
},
{
month:'2022-02',
days_count: 28,
total_value=6000
}]
days_count: количество дней записи в этом месяце,
total_value: сумма всех показаний в этом месяце
Я попробовал использовать django annotate для этого, попробовав следующее
HourlyData.objects.filter(
record_time__gte=start_date,
record_time__lte=end_date,
)
.annotate(
day=Trunc('record_time', 'day', output_field=models.DateField())
).values('day')
.annotate(total_sum= models.Sum('value'))
.values( 'total_sum', 'day')
.order_by('day')
Запрос выше суммирует общее значение за каждый день. в таком формате
<QuerySet [{'day': datetime.date(2020, 10, 6), 'total_sum': 126.28489942032}, {'day': datetime.date(2020, 10, 7), 'total_sum': 304.358586463236}, {'day': datetime.date(2020, 10, 8), 'total_sum': 304.140234726139}, {'day': datetime.date(2020, 10, 9), 'total_sum': 303.430313325472}, {'day': datetime.date(2020, 10, 10), 'total_sum': 303.156103881001}, {'day': datetime.date(2020, 10, 11), 'total_sum': 302.564397818492}, {'day': datetime.date(2020, 10, 12), 'total_sum': 301.924853438771}, {'day': datetime.date(2020, 10, 13), 'total_sum': 301.730580133637}]>
Однако мне нужно, чтобы эти данные были сгруппированы в месячные данные и подсчитывали количество дней в каждом месяце, когда была сделана запись.
Я попытался annotate получить этот результат и вычислить месячный_счет, сделав следующее
.annotate(month=ExtractMonth('day'),total=models.Sum('value'))
.values('month','total').annotate(month_count=models.Count('month')).values('month', 'month_count', 'total')
)
Результатом, который я получаю из этой аннотации, является подсчет того, сколько раз месяц встречается в исходном запросе. Я хочу, чтобы результат, полученный из первой аннотации, можно было сгруппировать в другую группировку по месяцам, чтобы я мог получить счетчик.