Это потому, что aggregate()
returns a dictionary:
агрегат() представляет собой терминал, пункт для QuerySet, что при вызове возвращает словарь имя-значение пар. Имя является идентификатором для совокупного значения; значение - вычисленная совокупность. Имя автоматически генерируется с именем поля и функцией агрегации .
Ключ этого словаря автоматически генерируется из полей, которые вы суммируете.
Одним из вариантов было бы получить номер из словаря с точки зрения:
staravg = UserReview.objects.filter(name__username__iexact=username).aggregate(Avg('stars'))['stars__avg']
Или, вы можете установить имя ключа вручную:
staravg = UserReview.objects.filter(name__username__iexact=username).aggregate(stars=Avg('stars'))['stars']
Или, если вы хотите получить это в шаблоне, используйте "dot notation", чтобы получить значение словарного элемента:
{{ staravg.stars__avg }}
Вы, возможно, аль поэтому необходимо применять floatformat
template filter округлить число до X знаков после запятой:
{{ staravg.stars__avg|floatformat:3 }}
Круто, я не знал о floatformat, я закончил писать свой собственный шаблон фильтра. – stephan