Django不会在整数十进制字段上存储.00

时间:2012-10-03 10:50:29

标签: django model save rounding

我试图强制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方法来存储值而不进行舍入?

2 个答案:

答案 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)存储两位小数的数字。