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

时间:2016-03-11 16:12:00

标签: python django numbers django-views rounding

我在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')),则说:

  

/ a float中的TypeError是必需的

math.ceilmath.floor

相同

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

3 个答案:

答案 0 :(得分:8)

您也可以使用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]

答案 1 :(得分:5)

您可以将其投放到IntegerField

from django.db.models import IntegerField

user_list = User.objects.select_related().annotate(
    rating=Avg('userrating__rating', output_field=IntegerField()))

答案 2 :(得分:2)

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

for user in user_list:
    user.rating = int(user.rating)
相关问题