这有点痛苦,并且
AbstractConcretebase显然需要更多的抛光,但是就像这样:
from sqlalchemy import *from sqlalchemy.orm import *from sqlalchemy.ext.declarative import declarative_base, AbstractConcretebasebase = declarative_base()class A(base): __tablename__ = 'a' id = Column(Integer, primary_key=True)class BC(AbstractConcretebase, base): passclass B(BC): __tablename__ = 'b' id = Column(Integer, primary_key=True) a_id = Column(Integer, ForeignKey('a.id')) __mapper_args__ = { "polymorphic_identity": "b", "concrete": True }class C(BC): __tablename__ = 'c' id = Column(Integer, primary_key=True) a_id = Column(Integer, ForeignKey('a.id')) __mapper_args__ = { "polymorphic_identity": "c", "concrete": True }configure_mappers()A.collection = relationship(BC, primaryjoin=BC.a_id == A.id)engine = create_engine("sqlite://", echo=True)base.metadata.create_all(engine)sess = Session(engine)sess.add_all([ A(collection=[ B(), C(), C() ]), A(collection=[ B(), B() ])])sess.commit()for a in sess.query(A): for bc in a.collection: print a, bc


