如何将Avg()舍入到最接近的整数?Django的

Sei*_*eif 4 python django numbers rounding django-views

我在views.py中有这个:

user_list = User.objects.select_related().annotate(rating=Avg('userrating__rating')).order_by('-rating')[:5]
Run Code Online (Sandbox Code Playgroud)

而且我想围绕Avg,所以我有一个很好的整数来评分.

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

它说:

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

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

需要/ a float的TypeError

相同的math.ceilmath.floor

看起来像是一个直接的事情,但我不知道该怎么做.谢谢.

ils*_*005 8

您还可以使用Func()表达式

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]
Run Code Online (Sandbox Code Playgroud)


Ant*_*ard 5

你可以把它投到一个IntegerField.

from django.db.models import IntegerField

user_list = User.objects.select_related().annotate(
    rating=Avg('userrating__rating', output_field=IntegerField()))
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不会四舍五入,而是截断为地板整数。 (3认同)

Sha*_*ang 2

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

for user in user_list:
    user.rating = int(user.rating)
Run Code Online (Sandbox Code Playgroud)