Получение суммы средних значений в наборе запросов django
def get_queryset(self):
current_academic_year = get_current_academic_year()
domains = Domain.objects.all()
start_date = self.request.query_params.get("start_date", current_academic_year.start_date)
end_date = self.request.query_params.get("end_date", current_academic_year.end_date)
queryset = Account.objects.annotate(**{
f"domain_overall_{domain.uuid}": Avg(
"assessed_from__accountevaluationresult__calculated_rating",
filter=Q(
assessed_from__updated__range=(start_date, end_date)
) & Q(assessed_from__domain=domain)
)
for domain in domains
}).annotate(**{f"domains_total": ~query~
})
Имеется пять доменов. Здесь у меня есть 5 пар ключ-значение с определенными вычисленными значениями для каждого домена. Мне нужно получить сумму этих значений из первой аннотации, но я понятия не имею, как получить ее в непрерывных аннотациях
Ответ, который мне нужен в json, должен быть таким:
- "domain_overall_8939396e-d0a9-4c87-afe1-ae3a4660d84b": 2,
- "domain_overall_786a99b4-38fd-4b60-ac91-5a09f007db32": 1,
- "domain_overall_a1f503a7-5e77-47ee-a812-7ae1fb4e8a84": 1,
- "domain_overall_4c55b38b-8471-48d1-bc43-323570b290a4": 1,
- "domain_overall_6ec0c80b-5afe-4ac2-8c07-0fff5c4f023c": 3,
- "domains_total": 8,
Какой лучший подход/решение здесь?
Поскольку вы все равно хотите получить все средние значения из базы данных, я бы вычислил сумму всех значений в Python, после получения данных.
Сначала упростим набор запросов:
queryset = Account.objects.filter(assessed_from__domain__in=domains).annotate(
domain=F('assessed_from__domain'),
average=Avg("assessed_from__accountevaluationresult__calculated_rating",
filter=Q(assessed_from__updated__range=(start_date, end_date)
).values('domain', 'average')
Это можно сделать с помощью ванильного Python следующим образом:
total_sum = sum(d.average for d in queryset)
Это также можно сделать быстрее с помощью Pandas, например:
df = pd.DataFrame(queryset)
total_sum = df['average'].agg('sum')
При таком подходе вы также можете проще сериализовать его в JSON:
df = df.append({"domain": "domains_totals", "average": total_sum}, ignore_index=True)
df = df.set_index("domain")
json_str = df['average'].to_json()