有没有办法在设置属性之后(或设置属性时)但在提交会话之前对对象执行验证?
例如,我有一个领域模型Device
有一个mac
财产。我想确保mac
属性在添加到数据库或在数据库中更新之前包含有效且经过清理的 mac 值。
看起来 Pythonic 方法是将大多数事情作为属性来完成(包括 SQLAlchemy)。如果我用 PHP 或 Java 进行编码,我可能会选择创建 getter/setter 方法来保护数据,并让我能够灵活地在域模型本身中处理此问题。
public function mac() { return $this->mac; }
public function setMac($mac) {
return $this->mac = $this->sanitizeAndValidateMac($mac);
}
public function sanitizeAndValidateMac($mac) {
if ( ! preg_match(self::$VALID_MAC_REGEX) ) {
throw new InvalidMacException($mac);
}
return strtolower($mac);
}
使用 SQLAlchemy 处理此类情况的 Pythonic 方法是什么?
(虽然我知道验证应该在其他地方处理(即 Web 框架),但我想弄清楚如何处理其中一些特定于域的验证规则,因为它们肯定会经常出现。)
UPDATE
我知道我可以使用property http://docs.python.org/library/functions.html#property在正常情况下执行此操作。关键部分是我将 SQLAlchemy 与这些类一起使用。我不太明白 SQLAlchemy 是如何发挥其魔力的,但我怀疑自己创建和覆盖这些属性可能会导致不稳定和/或不可预测的结果。
您可以使用以下命令在 SQLAlchemy 类中添加数据验证@validates()
装饰师。
从文档中 -简单的验证器 http://docs.sqlalchemy.org/en/rel_0_8/orm/mapper_config.html#simple-validators:
属性验证器可以引发异常,停止改变属性值的过程,或者可以将给定值更改为不同的值。
from sqlalchemy.orm import validates
class EmailAddress(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
email = Column(String)
@validates('email')
def validate_email(self, key, address):
# you can use assertions, such as
# assert '@' in address
# or raise an exception:
if '@' not in address:
raise ValueError('Email address must contain an @ sign.')
return address
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)