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?