我有一棵看起来像这样的树,通过多态继承来反映:
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,
}
问题是我需要反映更像这样的东西:
A
/ | \
B C D
/ \
E F
其中D不仅是A的多态性子,而且还是E的多态性父母。 F。
似乎我必须选择,D可以是多态的孩子,也可以是父母 - 它不能同时存在。
我有什么选择吗?
编辑:
为了解决这个问题,我最终弄平了这棵树,看起来像是:
A
/ | \ \
B C E F
D现已消失,其提供的功能在儿童(E& F)中。我可能会将常用部分变成mixin或其他东西。
不幸但我无法在这个特定问题上花更多时间。
答案 0 :(得分:3)
你绝对可以做到这一点。下面的代码使用declarative_base
,但显示了可行的模型设置。 D
类是使用类继承的父级和子级。但是,polymorphic_identity
仅存储在顶层。确保设置了所有正确的外键和类继承。
*注意:您的示例将type_id定义为Numeric,但值似乎是字符串。*
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)