Есть ли способ группировать аннотированные значения в другие группировки в 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')
            )

Результатом, который я получаю из этой аннотации, является подсчет того, сколько раз месяц встречается в исходном запросе. Я хочу, чтобы результат, полученный из первой аннотации, можно было сгруппировать в другую группировку по месяцам, чтобы я мог получить счетчик.

Вернуться на верх