ハンドラーの属性イベント( "append")にアタッチされている場合、追加アクションをキャンセルすることはできますか?
追加されたすべてのレコードのハンドラーに検証があり、レコードが検証に合格しない場合はスキップしたいとします。
ハンドラーの属性イベント( "append")にアタッチされている場合、追加アクションをキャンセルすることはできますか?
追加されたすべてのレコードのハンドラーに検証があり、レコードが検証に合格しない場合はスキップしたいとします。
検証を実行する別の方法については、 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)