Python 带有浮点形式输入的django整数模型字段

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方法中进行乘法备份,但是如果表单上出现错误,那么一切都会出

我正在使用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作为数据库。