python – 具有浮点形式输入的django整数模型字段
发布时间:2020-12-20 13:40:59 所属栏目:Python 来源:网络整理
导读:我正在使用 django模型,它将货币值存储为整数.即GBP22.35被存储为2235. 当该模型被呈现为一个表单时,我需要能够将一个小部件与该整数字段相关联,因此可以将其编辑为好像它是一个浮点值(即到两个小数位–22.35)并且如此验证.然后form.save()需要将本机整数值
我正在使用
django模型,它将货币值存储为整数.即GBP22.35被存储为2235.
当该模型被呈现为一个表单时,我需要能够将一个小部件与该整数字段相关联,因此可以将其编辑为好像它是一个浮点值(即到两个小数位–22.35)并且如此验证.然后form.save()需要将本机整数值保存到db. 我已经尝试创建一个自定义的FormField / Widget对,它包括在小部件渲染中除以100并在字段to_python方法中重新加倍,但如果表单上有错误则一切都会出错.小部件不断重新划分值. 我意识到这可以通过使用float / decimal模型字段来避免,但在这种情况下不是一个选项. 这是人们以前做过的事吗?有什么指针吗? 解决方法
您可以实现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中实现的验证 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |