gpt4 book ai didi

python - sqlalchemy 嵌套继承/多态关系

转载 作者:太空宇宙 更新时间:2023-11-03 11:06:54 25 4
gpt4 key购买 nike

我有一个看起来像这样的树,通过多态继承反射(reflect)出来:

      A
/ | \
B C D

效果很好,比如:

class BaseModel(db.Model):     # Table A in diagram
__tablename__ = "entities"

id = db.Column(db.BigInteger, primary_key=True, nullable=False, server_default=func.nextval('guid_seq'))
type_id = db.Column(db.SmallInteger, db.ForeignKey(EntityTypesModel.id))

__mapper_args__ = {
'polymorphic_identity':'entity',
'polymorphic_on':type_id,
'with_polymorphic':'*'
}

class BrandModel(BaseModel): # Table B, C, D in diagram
__tablename__ = 'brands'

id = db.Column(db.BigInteger, db.ForeignKey(StufffModel.id), primary_key=True, nullable=False)
name = db.Column(db.String, nullable=False)

__mapper_args__ = {
'polymorphic_identity':ET_BRAND,
}

问题是我需要反射(reflect)更多这样的事情:

              A
/ | \
B C D
/ \
E F

其中 D 不仅是 A 的多态子级,而且是 E 和 F 的多态父级。

看来我必须做出选择,D 可以是多态子代,也可以是父代——不能两者都是。

这里有什么选择吗?

编辑:

为了解决这个问题,我最终将树压平,使其看起来像:

      A
/ | \ \
B C E F

D 现在消失了,它提供的功能在 child (E 和 F)中。我可能会把公共(public)部分做成 mixin 之类的。

不幸的是,我不能在这个特定问题上花更多时间。

最佳答案

你绝对可以做到这一点。下面的代码使用了 declarative_base,但显示了有效的模型设置。 D 类既是父类又是使用类继承的子类。但是,polymorphic_identity 仅存储在顶层。确保您设置了所有正确的外键和类继承。

*注意:您的示例将 type_id 定义为数字,但值似乎是字符串。*

Base = declarative_base(cls=_BaseMixin)
Base.query = session.query_property()

class BaseModel(Base):
__tablename__ = 'entities'
id = Column(Integer, primary_key=True)
#type_id = Column(Integer, nullable=False)
type_id = Column(String, nullable=False)
__mapper_args__ = {
'polymorphic_identity': 'entity',
'polymorphic_on':type_id,
'with_polymorphic':'*'
}

class ModelB(BaseModel):
__tablename__ = 'modelB'
__mapper_args__ = {'polymorphic_identity': 'modelB'}
id = Column(Integer, ForeignKey('entities.id'), primary_key=True)
name = Column(String, nullable=False)

class ModelC(BaseModel):
__tablename__ = 'modelC'
__mapper_args__ = {'polymorphic_identity': 'modelC'}
id = Column(Integer, ForeignKey('entities.id'), primary_key=True)
name = Column(String, nullable=False)

class ModelD(BaseModel):
__tablename__ = 'modelD'
__mapper_args__ = {'polymorphic_identity': 'modelD'}
id = Column(Integer, ForeignKey('entities.id'), primary_key=True)
name = Column(String, nullable=False)

class ModelE(ModelD):
__tablename__ = 'modelE'
__mapper_args__ = {'polymorphic_identity': 'modelE'}
id = Column(Integer, ForeignKey('entities.id'), ForeignKey('modelD.id'), primary_key=True)
name = Column(String, nullable=False)

class ModelF(ModelD):
__tablename__ = 'modelF'
__mapper_args__ = {'polymorphic_identity': 'modelF'}
id = Column(Integer, ForeignKey('entities.id'), ForeignKey('modelD.id'), primary_key=True)
name = Column(String, nullable=False)

关于python - sqlalchemy 嵌套继承/多态关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16910782/

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