Как я могу получить предыдущее состояние объекта SQLAlchemy ORM после обновления db?

Проблема в том, что я не могу понять, как использовать SQLAlchemy, чтобы уведомить меня, когда объект переходит в новое состояние.

Я использую SQLAlchemy ORM (Declarative) для обновления объекта:

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 и value oldvalue . Проблема в том, что target параметр не полностью сформирован, поэтому он еще не имеет всех значений атрибутов.

Есть лучший способ сделать это? Благодаря!

    Моим решением было использовать «after_flush» SessionEvent вместо «set» AttributeEvent.

    Большое спасибо агрохолму, который предоставил этот пример кода 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) 

    registry представляет собой словарь, ключи которого являются MapperProperty и значениями которых являются обработчики событий. session , event , inspect и object_mapper – все классы и функции object_mapper .

    используйте событие before_update или событие before_flush, чтобы перехватить это событие на более поздний момент времени.