The mixin by itself is not mapped so MyAddressMixin.address is just a Column 
object, not the InstrumentedAttribute which accepts the "set" event.

So for this kind of thing you need to set up those events within an event of 
their own:


from sqlalchemy.orm import mapper
@event.listens_for(mapper, "mapper_configured")
def _listen_address(m, cls_):
    if issubclass(cls_, MyAddressMixin):
        event.listen(cls_.address, 'set', always_foo, retval=True)

class Employee(Base, MyAddressMixin):
    __tablename__ = 'employees'
    id = Column(Integer, primary_key=True)
    name = Column(String(100))

def always_foo(target, value, oldvalue, initiator):
    return "foo"


print Employee(address="Adsf").address

On Oct 4, 2011, at 5:10 PM, recurse wrote:

> I'm having issues trying to add an event listener to a mixin class
> (which doesn't subclass Base) and wondering what kind of work-around
> there might be.  It's probably easier to explain with an example
> ( http://paste.pocoo.org/show/487334/ )
> 
> Basically if I call event.listen(), and pass as a target an attribute
> of a class that doesn't inherit from Base, I get an error
> "AttributeError: 'DDLEventsDispatch' object has no attribute 'set' ".
> Is there a way around this?  Or a good way to automatically add a
> listener for every subclass of my Mixin?
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to