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

问题描述 投票:1回答:2

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。

我试图在queryset中使用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没有定义圆方法

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

python django django-queryset
2个回答
0
投票

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


0
投票

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

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

Book.objects.all().aggregate(Round(Avg('price'), 2))
© www.soinside.com 2019 - 2024. All rights reserved.