0

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

4

2 回答 2

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)
于 2012-10-03T11:38:10.033 回答
0

用于models.DecimalField(max_digits = 6, decimal_places = 2)存储两位小数的数字。

于 2012-10-03T10:59:34.423 回答