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

Django不会在整数十进制字段中存储.00,django,model,save,rounding,Django,Model,Save,Rounding,我试图强迫Django总是存储小数点后两位的数字,但是如果数字是一个整数,那么它就不能存储.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=RO

我试图强迫Django总是存储小数点后两位的数字,但是如果数字是一个整数,那么它就不能存储.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


如何重写保存方法来存储值而不舍入值?

使用
模型。DecimalField(最大位数=6,小数位数=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
这将始终返回指定的带
小数位的数字。您可以像使用普通的
分码字段
一样使用它,例如:

class FooModle(models.Model)
    number = MyDecimalField(decimal_places=2, max_digits=10)

模型中的字段是什么类型?抱歉,它们都是标准的
模型。DecimalField
或从
模型派生的自定义类型。DecimalField
为什么将其存储为
4
会有问题?只要它不将
4.10
存储为
4
,我就看不出这里有什么问题。模型字段已经有
小数点=2
最大位数=10
,所以有些东西正在对
.00
的任何值进行舍入,那么表单中可能有错误。尝试在clean_myfield中打印数据。检查它是否返回两位小数的值。我总是犯愚蠢的错误。所以clean\u myfield中的
data=self.cleandecimal(data)
做得很好!但是模型仍然不存储.00小数。如果我直接编辑数据库中的字段,那么它也会删除.00。这是一个更大的问题您是否尝试过在form类之外定义cleandecimal函数?我尝试了和你一样的编码。对我来说一切都很好。唯一的区别是我在form类之外定义了cleandecimal函数。@miki725指出问题出在db中,而不是Django,所以他的答案解决了我的问题。谢谢thoughYeah在尝试在db中输入一个值后,我认为它与db有关。谢谢,我现在就试试。