如何在Django中检索聚合查询的整数?

时间:2014-12-22 04:26:34

标签: django django-queryset django-aggregation

这可能是一个非常愚蠢的问题,但我如何使用下面的查询检索整数呢?

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

如果我在模板中{{staravg}},我会得到{'stars _avg':3.3333333333333335}。我知道我可以使用某种模板过滤器来检索3.333,但是必须有一种更简单的方法来检索整数吧?星星是来自IntegerField FYI。

2 个答案:

答案 0 :(得分:4)

这是因为aggregate() returns a dictionary

  

aggregate()是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 }}

答案 1 :(得分:2)

queryset返回一个字典。您需要将其转换为小数:

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