2012-05-04 12 views
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は単一テーブル継承を使用してEntityからサブクラス化されることに起因まず第一に、私はzones.idを参照することができますか?
  • 第2に、Zone.routesプロパティがマージTransit.startTransit.endになりますか?

答えて

1
  1. いいえ、あなたはありません、これらはマージされませんentities
  2. であるあなたのケースでは(単一テーブル継承)、テーブル名を使用する必要があります。 2つのリレーションシップを作成し、両方を結合する(ハイブリッド)プロパティを持つことができますが、このプロパティを変更する場合(たとえば、Transitsを追加する場合)は読み込み専用です。両側(startおよびend)。
  3. 私はここに質問を理解していないです

更新-1:コメントで要求されるように、下のコンクリートテーブル継承コード:

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") 
+0

私が追加した*場合 ' id'パラメータを 'Zone'に設定して継承テーブルの継承に移行すると、特に' zones.id'を対象にすることができますか? *「トランジット」はどのように宣言しますか?リンクされた 'Zone'から' Transit'インスタンスを編集できないのでうまくいきますか? *頼んだことは分かりませんので、お試しいただきありがとうございます。レッスンは、「眠気を誘発するかもしれない」投薬を受けた後、SOについて質問をしないことを学びました。 – Drakekin

+0

1) 'shift'の場合は、列を追加して別のテーブルを追加してからyesを追加します。 2)コードを含めるための回答が更新されます。 3)NP :) – van

関連する問題