2010-08-15 79 views
3

我有一个类映射两个多态继承:SQLAlchemy的 - 双多态继承问题

#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

为什么你需要另一个鉴别子来代替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__, 
    }