2016-03-11 39 views
3

我有这个在我的views.py:如何平均Avg()到最接近的整数? Django的

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

我要舍的魅力,所以我有一个很好的评级全面数字。

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

它说:

int()函数的参数必须是字符串或数字,而不是 '平均'

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

TypeError at/a float is required

同为math.ceilmath.floor

似乎是一个简单的事情,但我不知道该怎么做。谢谢。

+0

我的回答对你有帮助吗?如果愿意,请接受。 – ilse2005

回答

2

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

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

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

您可以只将其转换为IntegerField

from django.db.models import IntegerField 

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