Global Decimal Rounding Options In Django
Solution 1:
Worked in 1.9.5 (based on comment from @ark):
In myapp/apps.py
from __future__ import unicode_literals
import decimalfrom django.apps import AppConfig
classMyAppConfig(AppConfig):
name = 'myapp'def ready(self):
# Set precision
decimal.getcontext().prec = 9decimal.getcontext().rounding = decimal.ROUND_HALF_DOWN
In settings.py
INSTALLED_APPS = list(INSTALLED_APPS)
INSTALLED_APPS.append('myapp.apps.MyAppConfig')
Solution 2:
Decimal doesn't have anything to do with Django, they are part of the standard python library. The getcontext
function returns the context of the current thread, so if you're not doing anything funky, every request will be executed in one thread. That basically mean that setting the option in the settings.py
file should be enough.
Solution 3:
Actually it doesn't work like Viktor suggested (although in django 1.5).
My solution is create and using a middleware like this:
# -*- coding: utf-8 -*-
import decimalfrom django.conf import settings
classDecimalPrecisionMiddleware(object):
def process_request(self, request):
decimal_context = decimal.getcontext()
decimal_context.prec = settings.DECIMAL_PRECISION # say: 4
and then in settings.py:
MIDDLEWARE_CLASSES = (
'pathto.middleware.DecimalPrecisionMiddleware',
# etc..
)
Solution 4:
For django project can work setting decimal.DefaultContext (py3, py2).
This context is most useful in multi-threaded environments.
This is my code from settings.py
:
import decimal
# Setglobaldecimal rounding to ROUND_HALF_UP (instead of ROUND_HALF_EVEN).
project_context = decimal.getcontext()
project_context.rounding = decimal.ROUND_HALF_UP
decimal.DefaultContext = project_context
Worked in 1.10. Based on my answer in this question.
Post a Comment for "Global Decimal Rounding Options In Django"