Python sqlalchemy中的高级模型验证

Python sqlalchemy中的高级模型验证,python,validation,sqlalchemy,Python,Validation,Sqlalchemy,我有以下型号: class Foo(DeclarativeBase): code = Column(u'code', String(length=255)) ctype = Column(u'ctype', String(length=255)) 我需要验证一个字段相对于另一个字段的有效性 比如说 如果ctype==“bar”和code==“buzz”:提升值错误 提交时不要在db中创建对象和记录。如果没有出现任何异常,则按常规创建所有 我试着用它。 并尝试使用设置“插入前”事

我有以下型号:

class Foo(DeclarativeBase):
    code = Column(u'code', String(length=255))
    ctype = Column(u'ctype', String(length=255))
我需要验证一个字段相对于另一个字段的有效性

比如说

如果ctype==“bar”和code==“buzz”:提升值错误

提交时不要在db中创建对象和记录。如果没有出现任何异常,则按常规创建所有

我试着用它。 并尝试使用设置“插入前”事件 并编写了这样的代码:

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

event.listen(Foo, 'before_insert', validate_foo)
当ctype==“bar”和code==“buzz”时,它不会在数据库中创建任何对象。它没有引起任何例外。但是它创建了Foo对象实例(没有db)


进行此类验证的最佳方法是什么?

我最终在DB中创建了触发器(我使用postgresql)。在python代码中捕获完整性错误。

如何定义“最佳”?有些人可能希望将此验证直接放入数据库中。其他人可能希望将其放入模型本身,而不与SQLAlchemy有任何关联。其他人可能希望使用上面显示的SQLAlchemy事件。这个问题没有“正确答案”。您的实际问题是为什么没有调用
validate\u foo
方法?如果是这样,您应该提供更多详细信息(例如,您可以在希望引发验证事件的地方运行示例代码,但它没有触发)
validate\u foo
实际上被调用,但看起来像是在单独的线程中调用的。我的代码没有收到那个异常。