我正在使用django模型,它将货币值存储为整数。即22.35英镑存入2235.
当该模型被渲染为一个表单时,我需要能够将一个小部件与该整数字段相关联,因此可以编辑它,就好像它是一个浮点值(即两个小数位 - 22.35)并且被验证为。然后form.save()需要将本机整数值保存到db。
我已经尝试创建一个自定义的FormField / Widget对,它包括在窗口小部件渲染中除以100并在字段to_python方法中重新加倍,但如果窗体上有错误则一切都会出错。小部件不断重新划分值。
我意识到这可以通过使用float / decimal模型字段来避免,但在这种情况下不是一个选项。
这是人们以前做过的事吗?有什么指针吗? 感谢。
答案 0 :(得分:1)
您可以实现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
。
更新:从IntegerField
而不是DecimalField
派生的更简单的实现;添加了DecimalField.to_python