2014-12-22 1 views
1

Это может быть очень глупый вопрос, но как я могу просто получить Integer, используя запрос ниже?Как просто получить целое число агрегированного запроса в Django?

staravg = UserReview.objects.filter(name__username__iexact=username).aggregate(Avg('stars')) 

Если я {{staravg}} в шаблоне, я получаю { 'stars__avg': 3.3333333333333335}. Я знаю, что могу просто получить 3.333 с каким-то фильтром шаблона, но должен быть более простой способ просто получить Целое? звезды из IntegerField FYI.

ответ

2

Это потому, что 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 }} 
+0

Круто, я не знал о floatformat, я закончил писать свой собственный шаблон фильтра. – stephan

2

Запрос возвращает словарь. Вы должны преобразовать его в десятичное:

qs = UserReview.objects.filter(.... 
staravg = qs['stars__avg'] 

 Смежные вопросы

  • Нет связанных вопросов^_^