Получение суммы средних значений в наборе запросов 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()
Вернуться на верх