Django不会在整数十进制字段中存储.00
我试图强迫Django总是存储小数点后两位的数字,但是如果数字是一个整数,那么它就不能存储.00Django不会在整数十进制字段中存储.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
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有关。谢谢,我现在就试试。