在設置屬性之後(或之後),但在會話提交之前,是否有辦法對對象執行驗證?有沒有辦法在SQLAlchemy對象上透明地執行驗證?
例如,我有一個域模型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方法? (雖然我知道驗證,應該在其他地方(即網絡框架)處理我想弄清楚如何處理這些領域具體的驗證規則的一些,因爲他們必然會經常出現)。
UPDATE
我知道,我可以用property做到這一點在正常情況下。關鍵部分是我正在使用這些類的SQLAlchemy。我不明白SQLAlchemy如何執行它的魔法,但我懷疑創建和重寫這些屬性可能會導致不穩定和/或不可預知的結果。
我不知道什麼樣的神奇的SQLAlchemy的使用綁定到模型類的屬性。我不會認爲在我的類上定義我自己的'mac = property()'是安全的。我認爲我的問題是,這是安全的嗎?如果是這樣,是否有任何陷阱?如果不是,還有什麼其他的選擇? – 2010-03-06 07:07:04
沒有魔法。這不是陷阱。另一種方法是我們通常所做的:我們在模型類之外進行驗證*,使得它更簡單。在模型外定義你的驗證*,然後你不必擔心這一點。 – 2010-03-07 05:07:31