Python 带有浮点形式输入的django整数模型字段
我正在使用django模型,该模型将货币值存储为整数。i、 e.22.35英镑存储为2235英镑 当该模型呈现为表单时,我需要能够将一个小部件与该整数字段相关联,这样就可以像编辑浮点值一样进行编辑(即小数点后两位-22.35),并以此进行验证。然后,form.save()需要将本机整数值保存到数据库中 我尝试过创建一个定制的FormField/Widget对,其中包括在widgets呈现中除以100,然后在fields to_python方法中进行乘法备份,但是如果表单上出现错误,那么一切都会出错。小部件一直在重新划分值 我意识到这可以通过使用浮点/十进制模型字段来避免,但在这种情况下这不是一个选项 这是人们以前做过的吗?有什么建议吗?Python 带有浮点形式输入的django整数模型字段,python,django,forms,widget,Python,Django,Forms,Widget,我正在使用django模型,该模型将货币值存储为整数。i、 e.22.35英镑存储为2235英镑 当该模型呈现为表单时,我需要能够将一个小部件与该整数字段相关联,这样就可以像编辑浮点值一样进行编辑(即小数点后两位-22.35),并以此进行验证。然后,form.save()需要将本机整数值保存到数据库中 我尝试过创建一个定制的FormField/Widget对,其中包括在widgets呈现中除以100,然后在fields to_python方法中进行乘法备份,但是如果表单上出现错误,那么一切都会出
谢谢。您可以实现
DecimalField
的子类,在幕后处理转换:
import decimal
from django.db import models
from django.core import exceptions
from django.utils.translation import ugettext_lazy as _
class CentsField(models.IntegerField):
empty_strings_allowed = False
default_error_messages = {
'invalid': _("'%(value)s' value must be a decimal number."),
}
description = _("Fixed-point number")
__metaclass__ = models.SubfieldBase
def to_python(self, value):
if value is None or isinstance(value, decimal.Decimal):
return value
try:
if isinstance(value, int):
return decimal.Decimal(value) / 100
else:
return decimal.Decimal(value)
except decimal.InvalidOperation:
raise exceptions.ValidationError(
self.error_messages['invalid'],
code='invalid',
params={'value': value},
)
def get_prep_value(self, value):
return int(value * 100)
在Django代码中应表现为DecimalField
,但在数据库中应表现为IntegerField
更新:从
整数字段
而不是分码字段
派生出更简单的实现;添加了在DecimalField.to_python
中实现的验证,为什么不使用FloatField
??好的,我看你没有这个选项。@RaydelMiranda在浮动字段中存储货币数据是。使用firebird作为数据库。