2012-05-04 89 views
2

我有一個模型Zone,模型Entity和模型TransitTransit最低限度定義爲:組合關係

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也有一對夫婦大約距離,以及如何守得住是位的,但這並不影響這一點。

  • 首先,由於事實ZoneEntity使用單表繼承我可以引用zones.id子類?
  • 其次,Zone.routes屬性合併Transit.startTransit.end

回答

1
  1. 沒有,您需要使用表名,而你的情況(單表繼承)是entities
  2. 沒有,這些將不會被合併。您可以創建兩個關係,並擁有一個將混合兩者的(混合)屬性,但這僅用於閱讀目的,因爲當您想修改此屬性(例如,添加Transits)時,您仍需要指定雙方(startend)。
  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'嗎? *我將如何聲明'Transits'?無法從鏈接的「區域」編輯「Transit」實例,我很好嗎? *我不明白我問了什麼,所以謝謝你的嘗試。在服用「可能導致睏倦」的藥物後,經驗教訓不要提問SO。 – Drakekin

+0

1)如果用'shift',你的意思是:添加列並添加另一個表,然後是。 2)將更新答案以包含代碼。 3)NP :) – van