我有一个带有两个多态继承的类映射:
#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。
这是一个问题还是预期的工作?
答案 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__,
}