gpt4 book ai didi

sqlalchemy - 双重多态继承问题

转载 作者:行者123 更新时间:2023-12-03 17:26:43 24 4
gpt4 key购买 nike

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

#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。

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

最佳答案

为什么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__,
}

关于sqlalchemy - 双重多态继承问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3486833/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com