0

Djangoに常に小数点以下2桁の数値を格納させようとしていますが、数値が1つである場合、.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

その表現の問題。10 進数は、数値の表現ではなく数値を格納します。数学1.00的には に等しい1。したがって、データベースのバックエンドがすべてゼロのない最小の切り捨てられた 10 進数を格納している可能性があります。つまり、おそらく Django ではなく、db です。Django に常に小数点以下 2 桁の 10 進数を返すように強制したい場合は、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)小数点以下 2 桁の数値を格納するために使用します。

于 2012-10-03T10:59:34.423 に答える