【发布时间】:2011-01-24 08:20:48
【问题描述】:
有没有办法在设置属性之后(或之后)但在提交会话之前对对象执行验证?
例如,我有一个域模型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 方法是什么?
(虽然我知道验证应该在其他地方(即网络框架)处理,但我想弄清楚如何处理其中一些特定于域的验证规则,因为它们一定会经常出现。)
更新
我知道在正常情况下我可以使用property 来执行此操作。关键部分是我在这些类中使用 SQLAlchemy。我不完全了解 SQLAlchemy 是如何发挥其魔力的,但我怀疑我自己创建和覆盖这些属性可能会导致不稳定和/或不可预测的结果。
【问题讨论】:
标签: python validation model dns sqlalchemy