我试图强制Django始终存储2位小数的数字,但如果数字是整数,则不存储.00
def clean_myfield(self):
data = self.cleaned_data['myfield']
self.cleandecimal(data)
return data
def cleandecimal(self, data):
data = Decimal(data).quantize(Decimal('.01'), rounding=ROUND_DOWN)
print 'data ', data
return data
我的打印件始终按预期显示,例如4.00但是存储为4
如何覆盖save方法来存储值而不进行舍入?
答案 0 :(得分:2)
它是一个代表问题。十进制数字存储数字,而不是它们的表示。数学1.00
等于1
。因此,您的数据库后端可能存储最小的截断小数而不是全零 - 所以它可能不是Django,而是db。如果你想强制Django总是返回两位小数的十进制,你可以覆盖DecimalField:
class MyDecimalField(models.DecimalField):
__metaclass__ = models.SubfieldBase
def __init__(self, *args, **kwargs):
super(self.__class__, self).__init__(*args, **kwargs)
places = kwargs.get('decimal_places', 2)
self.q = Decimal(10) ** -places
def to_python(self, value):
value = super(self.__class__, self).to_python(value)
if isinstance(value, Decimal):
return value.quantize(self.q)
else:
return value
这将始终返回指定decimal_places
的数字。您可以像使用普通DecimalField
一样使用它,例如:
class FooModle(models.Model)
number = MyDecimalField(decimal_places=2, max_digits=10)
答案 1 :(得分:0)
使用models.DecimalField(max_digits = 6, decimal_places = 2)
存储两位小数的数字。