【问题标题】:How to just retrieve the integer of a aggregate query in Django?如何在 Django 中检索聚合查询的整数?
【发布时间】:2015-02-20 04:35:35
【问题描述】:

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

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

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

【问题讨论】:

    标签: django django-queryset django-aggregation


    【解决方案1】:

    这是因为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 }}
    

    【讨论】:

    • 酷,我不知道 floatformat,我最终编写了自己的模板过滤器。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-23
      • 2012-04-01
      • 1970-01-01
      • 2013-03-31
      • 2013-02-05
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      • 2019-12-04
      相关资源
      最近更新 更多