Агрегаторы окон кверисетов Django

У меня есть довольно простая модель, назовем ее Metric:

class Metric(models.Model):
    metric_1 = models.FloatField()
    ...

Теперь предположим, что есть метрика для каждого дня и человека, и у меня есть конечная точка, которая вычисляет среднее значение этих метрик за определенный период и изменение по сравнению с предыдущим месяцем. Прямой (но, возможно, неэффективный?) подход:

def calculate_aggregates(self, previous_start, start, end, member):
        
    metrics = DailyLoadDataMetric.objects.filter(target_member=member, 
                  target_date__gte=previous_start, 
                  target_date__lte=end)

    previous_metrics = metrics.filter(target_date__lte=start)
    current_metrics = metrics.filter(target_date__gte=start)

    curr_aggregates = current_metrics.aggregate(
                        average_metric_1=Avg('metric_1')))

    prev_aggregates = previous_metrics.aggregate(
                        average_metric_1=Avg('metric_1'))
        
    aggregates = {
            'average_metric_1': curr_aggregates['average_metric_1'],
            'average_metric_1_change': ((curr_aggregates['average_metric_1'] / prev_aggregates['average_metric_1']) - 1.0) * 100,
        }
        

    return aggregates

Кажется, что нечто подобное может быть выполнено полностью силами базы данных. Но как? В частности, поскольку мне нужно среднее значение за предыдущий месяц, я должен выполнить два вызова aggregate, дважды обращаясь к базе данных. Я просмотрел оконные функции, но, похоже, их можно использовать только с annotate, что не похоже на то, что мне нужно.

Есть ли что-то, что берет весь набор запросов и вычисляет агрегаты на основе заданного разбиения? В данном случае это может быть даже фиксированное количество строк, потому что я знаю, что у меня есть одна строка Metric для каждого дня.

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