SqlAlchemy:取消事件处理程序操作

时间:2012-06-29 13:18:18

标签: events sqlalchemy

当我附加到处理程序中的属性事件(“append”)以取消追加操作时,是否可以?

假设我在处理程序中为每个附加记录进行了一些验证,如果记录没有通过验证我想要被删除。

1 个答案:

答案 0 :(得分:1)

有关执行验证的其他方法,请参阅sqlalchemy.orm.validates,这会产生更清晰的代码。根据文件:

  

然后,该函数可以引发验证异常以停止该过程   来自continue(Python的内置ValueError和AssertionError)   例外是合理的选择),或者可以修改或替换值   在继续之前。否则该函数应返回给定的   值。

class User(...):
    # ...
    addresses = relationship("Address")

    @validates('addresses')
    def _modify_addresses(self, key, target):
        if target.phone is None
            raise ValueError("User addresses must have a phone number!")
        return target

根据文档,您可以修改添加到集合的值。但要完全避免添加它,您需要引发异常。显然,您需要在外部代码中处理此异常:

def _add_addresses(user, address_list):
    for address in address_list:
        try:
            user.addresses.append(address)
        catch ValueError as _exc:
            logging.warn("Could not add Address [%s] to the User [%s]", address, user.name)