sqlalchemy - 双重多态继承问题

时间:2010-08-15 09:25:24

标签: sqlalchemy multiple-inheritance polymorphism

我有一个带有两个多态继承的类映射:

#test classes

class AbstractA(Base):

    __tablename__ = "abstract_a"

    id = Column(Integer, primary_key=True)
    class_name = Column('class_name', String(50))

    __mapper_args__ = {
      'polymorphic_on': class_name,
    }


#some stuff here

class AbstractB(AbstractA):

    __tablename__ = "abstract_b"

    id = Column(Integer, ForeignKey('abstract_a.id'), primary_key=True)
    class_name = Column('class_name', String(50))

    __mapper_args__ = {
      'polymorphic_on': class_name,
      'polymorphic_identity': __tablename__,
    }

#some stuff here

class ClassA(AbstractB):

    __tablename__ = "table_a"
    __mapper_args__ = {
      'polymorphic_identity': __tablename__,
    }

    id = Column(Integer, ForeignKey('abstract_b.id'), primary_key=True)
    label = Column('label', String(50))

    def __init__(self, label):
        self.label = label

我坚持使用ClassA对象:

object = ClassA('toto')
db_session.add(object)
db_session.commit()

当我尝试像这样重新加载对象时:

reloaded_object = AbstractB.query.first()

我找回了一个ClassA对象(很好)

但是当我尝试像这样重新加载时:

reloaded_object = AbstractA.query.first()

我找回了一个AbstractA对象,因为abstract_a.class_name尚未设置为polymorphic_identity。

这是一个问题还是预期的工作?

1 个答案:

答案 0 :(得分:2)

为什么你需要AbstractB子类的另一个鉴别器而不是单个AbstractA.class_name用于整个继承树?只需从AbstractB定义中删除2行,您的测试即可运行:

class AbstractB(AbstractA):

    __tablename__ = "abstract_b"

    id = Column(ForeignKey('abstract_a.id'), primary_key=True)

    __mapper_args__ = {
        'polymorphic_identity': __tablename__,
    }