Двойная агрегация кверисетов в 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, потому что до и после этого происходит куча другой фильтрации. Посоветуйте что-нибудь?