在Django中全局设置小数选项

时间:2018-07-27 14:25:40

标签: python django

Python中十进制的默认舍入方法为ROUND_HALF_EVEN。

我有一个Django 2.0应用程序,需要在所有模型DecimalFields中使用ROUND_HALF_UP。

我已经尝试过此问题中给出的所有3个答案:

Global decimal rounding options in Django

但是没有一个起作用。例如,使用第二个解决方案中提供的apps.py方法-我已确认通过调用

更改了Decimal的上下文。
decimal.getcontext()

设置后立即

decimal.getcontext().rounding = decimal.ROUND_HALF_UP

然后我可以通过进入Django shell并调用

来确认这一点
import decimal
decimal.getcontext()

报告四舍五入= ROUND_HALF_UP

但是,如果我再次致电

decimal.getcontext()

在模型的save方法中,舍入选项已恢复为ROUND_HALF_EVEN-对我来说,存在多个上下文?

我想了解是否可以在全局范围内将小数设置为ROUND_HALF_UP,如果可以,我的代码哪里出问题了?

我目前正在django开发服务器上运行该应用程序,并使用Python 3.6.4

2 个答案:

答案 0 :(得分:0)

通过在Django应用__init__中将最高定义放置在config/__init__.py上,我们可以做到这一点。

出于我们的目的,我们还将覆盖DefaultContext的四舍五入:

decimal.DefaultContext.rounding = decimal.ROUND_HALF_UP
decimal.setcontext(decimal.DefaultContext)

答案 1 :(得分:0)

getcontext 仅适用于当前线程,不会在执行视图时调用。相反,您应该在应用配置或 settings.py 中设置 DefaultContext。所有其他线程将自动继承此上下文。

例如,在 settings.py 中添加:

DefaultContext.rounding=ROUND_HALF_UP