4

ポリモーフィック継承を介して反映された、次のようなツリーがあります。

      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) にあります。共通部分はミックスインか何かにしようかな。

残念ながら、この特定の問題にこれ以上時間を割くことができませんでした。

4

1 に答える 1

5

あなたは間違いなくこれを行うことができます。以下のコードは を使用してdeclarative_baseいますが、機能するモデルのセットアップを示しています。Dclass は、クラス継承を使用する親と子の両方です。ただし、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)
于 2013-06-04T07:55:24.447 に答える