import traceback from sqlalchemy import Column, Integer, String, ForeignKey, Table from sqlalchemy.orm import relationship from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.associationproxy import association_proxy Base = declarative_base() class User(Base): __tablename__ = 'user' id = Column(Integer, primary_key=True) name = Column(String(64)) kws = relationship("Keyword", secondary='user_keyword') keywords = association_proxy('kws', 'keyword') class UserKeyword(Base): __tablename__ = 'user_keyword' id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey('user.id')) keyword_id = Column(Integer, ForeignKey('keyword.id')) class Keyword(Base): __tablename__ = 'keyword' id = Column(Integer, primary_key=True) keyword = Column('keyword', String(64)) def main(): print 'owning_class is None' assert User.__mapper__.all_orm_descriptors['keywords'].owning_class is None print 'association proxy throwing error' try: User.__mapper__.all_orm_descriptors['keywords'].target_class except Exception: print '-'*50 traceback.print_exc() print '-'*50 print 'accessing association proxy via class sets owning_class' assert User.keywords is not None print 'owning_class remains set' assert User.__mapper__.all_orm_descriptors['keywords'].owning_class is not None print 'association proxy no longer throwing error' User.__mapper__.all_orm_descriptors['keywords'].target_class if __name__ == '__main__': main()