python sqlalchemy pylons

python - SQLAlchemy "event.listen" para todos los modelos



pylons (1)

Hereda todos sus modelos de la clase base y suscríbase a esa clase base:

event.listen(MyBaseMixin, ''before_insert'', get_created_by_id) event.listen(MyBaseMixin, ''before_update'', get_updated_by_id)

Ver más en Mixin y Custom Base Classes

Tengo campos created_by y updated_by en cada modelo. Estos campos se llenan automáticamente con sqlalchemy.event.listen (anteriormente MapperExtension). Para cada modelo, escribo:

event.listen(Equipment, ''before_insert'', get_created_by_id) event.listen(Equipment, ''before_update'', get_updated_by_id)

Cuando el modelo era un montón de código se pone feo. ¿Es posible aplicar event.listen inmediatamente a todos los modelos o a varios?

UPD: estoy tratando de hacerlo:

import pylons from sqlalchemy import event, sql from sqlalchemy import Table, ForeignKey, Column from sqlalchemy.databases import postgresql from sqlalchemy.schema import UniqueConstraint, CheckConstraint from sqlalchemy.types import String, Unicode, UnicodeText, Integer, DateTime,/ Boolean, Float from sqlalchemy.orm import relation, backref, synonym, relationship from sqlalchemy import func from sqlalchemy import desc from sqlalchemy.orm.exc import NoResultFound from myapp.model.meta import Session as s from myapp.model.meta import metadata, DeclarativeBase from pylons import request def created_by(mapper, connection, target): identity = request.environ.get(''repoze.who.identity'') if identity: id = identity[''user''].user_id target.created_by = id def updated_by(mapper, connection, target): identity = request.environ.get(''repoze.who.identity'') if identity: id = identity[''user''].user_id target.updated_by = id from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.ext.declarative import has_inherited_table class TestMixin(DeclarativeBase): __tablename__ = ''TestMixin'' id = Column(Integer, autoincrement=True, primary_key=True) event.listen(TestMixin, ''before_insert'', created_by) event.listen(TestMixin, ''before_update'', updated_by) class MyClass(TestMixin): __tablename__ = ''MyClass'' __mapper_args__ = {''concrete'':True} id = Column(Integer, autoincrement=True, primary_key=True) created_by = Column(Integer, ForeignKey(''user.user_id'', onupdate="cascade", ondelete="restrict")) updated_by = Column(Integer, ForeignKey(''user.user_id'', onupdate="cascade", ondelete="restrict"))

Cuando agrego un nuevo objeto MyClass, he created_by = None. Si creo event.listen para MyClass todo está bien. ¿Qué pasa?