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

Posted

技术标签:

【中文标题】具有浮点形式输入的 django 整数模型字段【英文标题】:django integer model field with float form input 【发布时间】:2014-04-15 02:58:05 【问题描述】:

我正在使用将货币值存储为整数的 django 模型。即 GBP22.35 存储为 2235。

当该模型呈现为表单时,我需要能够将小部件与该整数字段相关联,以便可以将其编辑为浮点值(即两位小数 - 22.35)并进行验证. form.save() 然后需要将本机整数值保存到数据库。

我尝试创建一个自定义 FormField/Widget 对,其中包括在小部件渲染中除以 100,并在字段 to_python 方法中乘以备份,但如果表单上出现错误,这一切都会出错。小部件不断重新划分值。

我意识到这可以通过使用浮点/十进制模型字段来避免,但在这种情况下这不是一个选项。

这是人们以前做过的事情吗?任何指针? 谢谢。

【问题讨论】:

为什么不使用FloatField ??好的,我看你没有那个选项。 @RaydelMiranda 在FloatField 中存储货币数据是never an acceptable option。 使用 firebird 作为数据库。 【参考方案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

中实现的验证

【讨论】:

以上是关于具有浮点形式输入的 django 整数模型字段的主要内容,如果未能解决你的问题,请参考以下文章

使用与默认用户模型具有外键关系的 Django 模型

在 Django 模型中保存时区

创建一个具有自动填充逗号或点到浮点字段功能的小部件(Odoo 13)

如何在 django 模型中从一个字段添加多个输入

c语言中定义浮点变量输入用的整数会报错吗

模型和字段