在插入或更新之前修改所有数字

Mar*_*son 2 sqlalchemy

在SqlAlchemy中,我使用:

price = Column(Numeric(18, 5))
Run Code Online (Sandbox Code Playgroud)

以各种方式放置在我的应用中。当我得到一个用瑞典语格式化的数字时,用逗号而不是点(0,34代替0.34),并尝试更改价格列,该数字将设置为0.00000。

为了解决这个问题,我有以下代码:

obj.price = price.replace(',','.')
Run Code Online (Sandbox Code Playgroud)

但是,在代码中遍历所有内容会使它变得很丑陋,而这样做的风险是我忘记了一个地方。在将值从字符串转换为数字之前,是否有可能会调用某种通用的转换函数?而且我只将其放在一个地方。

arc*_*nic 5

检查validatesSQLAlchemy 的装饰器:http : //docs.sqlalchemy.org/en/rel_1_0/orm/mapped_attributes.html

向属性添加“验证”例程的快速方法是使用validates()装饰器。属性验证器可以引发异常,从而停止更改属性值的过程,也可以将给定值更改为其他值。

在您的情况下,代码可能类似于:

from sqlalchemy.orm import validates

class Obj(Base):
    __tablename__ = 'obj'

    id = Column(Integer, primary_key=True)
    price = Column(Numeric(18, 5))

    @validates('price')
    def validate_price(self, key, price):
        if ',' in price:
            return float(price.replace(',','.'))
        else:
            return float(price)
Run Code Online (Sandbox Code Playgroud)