2013-11-04 98 views
3

我有以下以下模型:高級模型驗證

class Foo(DeclarativeBase): 
    code = Column(u'code', String(length=255)) 
    ctype = Column(u'ctype', String(length=255)) 

我需要驗證一個領域,相對於另一個。

例如

if ctype == "bar" and code == "buzz": raise ValueError

不要創建犯數據庫對象和記錄。如果沒有發生異常,照例創建。

我試過使用。 Simple validators 並試圖建立「before_insert」使用before_insert mapper event 事件,並寫了這樣的代碼:

def validate_foo(mapper, connection, target): 
    if target.ctype == "bar" and target.code == "buzz": 
     raise ValueError 

event.listen(Foo, 'before_insert', validate_foo) 

當CTYPE ==「欄」和代碼==「嗡嗡」,它不會創建任何數據庫對象。它不會引發任何異常。但它創建Foo對象實例(不帶db)。

做這種驗證的最佳方法是什麼?

+0

你如何定義「最好」?有些人可能想要直接在數據庫中進行驗證。其他人可能希望將它放入模型本身,而不需要與SQLAlchemy綁定。其他人可能想要使用上面顯示的SQLAlchemy事件。這個問題沒有「正確答案」。你真正的問題是爲什麼你的'validate_foo'方法沒有被調用?如果是這樣,你應該提供更多的細節(例如你可以運行的示例代碼,你希望啓動你的驗證事件,但它不會觸發) –

+0

'validate_foo'實際上被調用,但它看起來像它在單獨調用線程等。而我的代碼沒有收到該例外。 –

回答

0

我已經結束了在DB中創建觸發器(我使用postgresql)。在Python代碼中捕捉完整性錯誤。