【问题标题】:How to round Avg() to nearest integer? django如何将 Avg() 舍入到最接近的整数? django
【发布时间】:2016-03-11 16:11:59
【问题描述】:

我的views.py中有这个:

user_list = User.objects.select_related().annotate(rating=Avg('userrating__rating')).order_by('-rating')[:5]

我想对平均值进行四舍五入,这样我就有很好的整数来进行评分。

但是,如果我使用int(Avg('userrating__rating')))

上面写着:

int() 参数必须是字符串或数字,而不是 'Avg'

如果我使用round(Avg('userrating__rating')),它会说:

TypeError at / 需要浮点数

math.ceilmath.floor 相同

似乎是一件直截了当的事情,但我不知道该怎么做。谢谢。

【问题讨论】:

  • 我的回答对您有帮助吗?如果是,请接受。
  • 更新:在Django v2.2中添加了与给定答案类似的功能,名称为Round

标签: python django numbers django-views rounding


【解决方案1】:

你也可以使用Func() expressions

from django.db.models import Func
class Round(Func):
    function = 'ROUND'
    template='%(function)s(%(expressions)s, 0)'

user_list = User.objects.select_related().annotate(rating=Round(Avg('userrating__rating'))).order_by('-rating')[:5]

【讨论】:

    【解决方案2】:

    您可以将其转换为 IntegerField

    from django.db.models import IntegerField
    
    user_list = User.objects.select_related().annotate(
        rating=Avg('userrating__rating', output_field=IntegerField()))
    

    【讨论】:

    • 请注意,这不会四舍五入,而是截断为整数。
    【解决方案3】:

    您不应该尝试在原始 orm 调用中包装任何转换函数,因为您尝试的不是有效的 django api。但是你总是可以在得到结果后转换数字:

    for user in user_list:
        user.rating = int(user.rating)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-21
      • 1970-01-01
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多