2

モデルZone、モデルEntity、モデルがありTransitます。Transit最低限、次のように定義されます。

class Entity(db.Model):
    __tablename__ = 'entities'
    id = db.Column(db.Integer, primary_key=True)
    contained_by = db.Column(db.Integer, db.ForeignKey('entities.id'))
    contains = db.relationship('Entity', backref='container')
    discriminator = db.Column('type', db.String(50))
    __mapper_args__ = {'polymorphic_on': discriminator}

class Zone(Entity):
    __mapper_args__ = {'polymorphic_identity': 'zones'}
    routes = db.relationship('Transit')
    (stuff goes here)

class Transit(db.Model):
    __tablename__ = "transits"
    start = db.Column(db.Integer, db.ForeignKey('zones.id'))
    end = db.Column(db.Integer, db.ForeignKey('zones.id'))

Zoneまた、距離とそれがどれほど防御可能であるかについていくつかのビットがありますが、それはこれには関係ありません。

  • まず、単一テーブル継承の使用Zoneからサブクラス化されているという事実のために、参照できますか?Entityzones.id
  • 第二に、Zone.routesプロパティはマージTransit.startされTransit.endますか?
4

1 に答える 1

1
  1. いいえ、テーブル名を使用する必要があります。この場合、(単一テーブル継承)は次のようになります。entities
  2. いいえ、これらはマージされません。2つの関係を作成し、両方を組み合わせる(ハイブリッド)プロパティを設定できますが、このプロパティを変更する場合(たとえば、add Transits)は、両方を指定する必要があるため、これは読み取りのみを目的としています。サイド(startおよびend)。
  3. ここでの質問を理解できません

update-1:コメントで要求されたとおり、Concrete-以下のテーブル継承コード:

class Zone(Entity):
    __mapper_args__ = {'polymorphic_identity': 'zones'}
    __tablename__ = "zones"
    id          = Column(Integer, ForeignKey('entities.id'), primary_key=True)
    @property
    def transits(self):
        return self.transits_from_here + self.transits_to_here

class Transit(Base):
    __tablename__ = "transits"
    id          = Column(Integer, primary_key=True)
    start = Column(Integer, ForeignKey('zones.id'))
    end = Column(Integer, ForeignKey('zones.id'))

    s_zone = relationship(Zone, primaryjoin=(start==Zone.id), backref="transits_from_here")
    e_zone = relationship(Zone, primaryjoin=(end==Zone.id), backref="transits_to_here")
于 2012-05-04T06:36:09.250 に答える