3

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

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

如果我在模板中执行 {{ staravg }},我会得到 {'stars__avg': 3.3333333333333335}。我知道我可以使用某种模板过滤器来检索 3.333,但是必须有一种更简单的方法来检索 Integer 对吗?星星来自 IntegerField 仅供参考。

4

2 回答 2

5

这是因为aggregate()返回一个字典

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

或者,如果您想在模板中获取它,请使用“点表示法”来获取字典项的值:

{{ staravg.stars__avg }}

您可能还需要应用floatformat模板过滤器将数字四舍五入到 X 位小数:

{{ staravg.stars__avg|floatformat:3 }}
于 2014-12-22T04:32:26.140 回答
3

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

 qs = UserReview.objects.filter(....
 staravg = qs['stars__avg']
于 2014-12-22T04:30:53.990 回答