问题是我不知道如何使用 SQLAlchemy 在对象进入新状态时通知我。
我正在使用 SQLAlchemy ORM(声明式)来更新对象:
class Customer(declarative_base()):
__table_name__ = "customer"
id = Column(Integer, primary_key=True)
status = Column(String)
我想知道一个物体何时进入某种状态。特别是在发出更新之后以及状态发生变化时。例如。Customer.status == 'registered'
它以前有不同的状态。
我目前正在做这件事'set'
属性事件:
from sqlalchemy import event
from model import Customer
def on_set_attribute(target, value, oldvalue, initiator):
print target.status
print value
print oldvalue
event.listen(
Customer.status,
'set',
on_set_attribute,
propagate=True,
active_history=True)
每次对该属性调用“set”时,我的代码都会触发,并且我检查是否value
和oldvalue
是不同的。问题是target
参数尚未完全形成,因此尚未填充所有属性值。
有一个更好的方法吗?谢谢!
我的解决方案是使用“after_flush”SessionEvent 而不是“set”AttributeEvent。
非常感谢阿格伦霍尔姆 https://stackoverflow.com/users/242021/agronholm谁提供了专门检查对象的值和旧值的示例 SessionEvent 代码。
下面的解决方案是对其代码的修改:
def get_old_value(attribute_state):
history = attribute_state.history
return history.deleted[0] if history.deleted else None
def trigger_attribute_change_events(object_):
for mapper_property in object_mapper(object_).iterate_properties:
if isinstance(mapper_property, ColumnProperty):
key = mapper_property.key
attribute_state = inspect(object_).attrs.get(key)
history = attribute_state.history
if history.has_changes():
value = attribute_state.value
# old_value is None for new objects and old value for dirty objects
old_value = get_old_value(attribute_state)
handler = registry.get(mapper_property)
if handler:
handler(object_, value, old_value)
def on_after_flush(session, flush_context):
changed_objects = session.new.union(session.dirty)
for o in changed_objects:
trigger_attribute_change_events(o)
event.listen(session, "after_flush", on_after_flush)
The registry
是一个字典,其键是 MapperProperty 的,其值是事件处理程序。session
, event
, inspect
, and object_mapper
都是 sqlalchemy 类和函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)