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

我正在使用 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中实现的验证

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...