我在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.ceil
或math.floor
似乎是一件直截了当的事,但我不知道该怎么做。谢谢。
答案 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)