如何在Django queryset的F()表达式中以一定的精度获取float结果

时间:2019-04-24 08:59:00

标签: python django django-queryset

addon_income = round(pendingAmount*0.1, 2)
print(addon_income)  # if pendingAmount = 6, addon_income = 0.6 which is ok here

Wallet.objects.filter(id=###).update(
    active=F('active')+addon_income, total=F('total')+addon_income,
    uddate_time=timezone.now()
)

在上面的查询集中,如果F('active')= 41.2,F('total')= 41.2,并且addon_income = 0.6,则更新后active和total分别为41.800000000000004和41.800000000000004。

我试图在查询集中使用round(),如下所示:

Wallet.objects.filter(id=###).update(
    active=round(F('active')+addon_income, 2), total=round(F('total')+addon_income, 2),
    uddate_time=timezone.now()
)

但返回错误:类型CombinedExpression没有定义 round 方法

有人有什么建议吗?谢谢!

2 个答案:

答案 0 :(得分:0)

Django具有Cast函数,该函数可以在查询中使用。在该函数中,您可以指定FloatField(decimal_places=2)

答案 1 :(得分:0)

我尝试了这篇文章中的解决方案:Django ORM how to Round an Avg result

class Round(Func):
  function = 'ROUND'
  arity = 2

Book.objects.all().aggregate(Round(Avg('price'), 2))