0

ハンドラーの属性イベント( "append")にアタッチされている場合、追加ア​​クションをキャンセルすることはできますか?

追加されたすべてのレコードのハンドラーに検証があり、レコードが検証に合格しない場合はスキップしたいとします。

4

1 に答える 1

1

検証を実行する別の方法については、 sqlalchemy.orm.validatesを参照してください。これにより、コードがいくらかクリーンになります。ドキュメントによると:

次に、関数は検証例外を発生させてプロセスの続行を停止したり(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)
于 2012-06-29T14:00:32.270 に答える