Двойная агрегация кверисетов в django

У меня есть данные, которые выглядят следующим образом:

[{
    'ticker': 'ACVA-US', 
    'source': 'INTERNAL',
    'event_id': 300, 
    'value_usd': 3000.0, 
    'shares': 300.0, 
    'days_to_trade': 3.0, 
    'num_trades': 1
},
{
    'ticker': 'ACVA-US',
    'source': 'INTERNAL',  
    'event_id': 200, 
    'value_usd': 2000.0, 
    'shares': 200.0, 
    'days_to_trade': 2.0, 
    'num_trades': 1
},
{
    'ticker': 'ACVA-US',
    'source': 'EXTERNAL',  
    'event_id': 200, 
    'value_usd': 1000.0, 
    'shares': 100.0, 
    'days_to_trade': 1.0, 
    'num_trades': 1
}]

Мне нужно выполнить то, что по сути является двойной агрегацией. Во-первых, мне нужно взять среднее значение элементов с одинаковым тикером+событие, что будет выглядеть следующим образом:

[{
    'ticker': 'ACVA-US', 
    'event_id': 300, 
    'value_usd': 3000.0, 
    'shares': 300.0, 
    'days_to_trade': 3.0, 
    'num_trades': 1
},
{
    'ticker': 'ACVA-US',
    'event_id': 200, 
    'value_usd': 1500.0, 
    'shares': 150.0, 
    'days_to_trade': 1.5, 
    'num_trades': 2
}]

Далее, мне нужно суммировать элементы по тикерам, что будет выглядеть следующим образом:

[{
    'ticker': 'ACVA-US', 
    'value_usd': 4500.0, 
    'shares': 450.0, 
    'days_to_trade': 4.5, 
    'num_trades': 3
}]

Я не могу понять, как это сделать с помощью Django. Я пробовал:

query1 = queryset.values('ticker', 'event_id').annotate(value_usd=Avg('value_usd'), shares=Avg('shares'), days_to_trade=Avg('days_to_trade'), num_trades=Count('ticker'))
query2 = query1.values('ticker').annotate(value_usd=Sum('value_usd'), shares=Sum('shares'), days_to_trade=Sum('days_to_trade'), num_trades=Count('security'))

но я получаю ошибку django.core.exceptions.FieldError: Cannot compute Sum('value_usd'): 'value_usd' is an aggregate.

Я надеялся сделать это без необходимости создавать представление в базе данных, которое выполняет первое агрегирование, но пока я не могу понять этого. Мне нужно выполнить это на уровне набора запросов, не опускаясь в необработанный SQL, потому что до и после этого происходит куча другой фильтрации. Посоветуйте что-нибудь?

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