[Answered ]-Getting sum of averages in a django queryset

1👍

Because you want to fetch all averages from db anyway, I would calculate the sum of all values in Python, after fetching the data.

First, lets simplify the queryset:

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')

This can be done using vanilla Python like:

total_sum = sum(d.average for d in queryset)

This can also be done faster using Pandas, like:

df = pd.DataFrame(queryset)
total_sum = df['average'].agg('sum')

With this approach, you can also serialize it to JSON easier:

df = df.append({"domain": "domains_totals", "average": total_sum}, ignore_index=True)
df = df.set_index("domain")
json_str = df['average'].to_json()

Leave a comment