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
4

1 回答 1

1
  1. 不,您需要使用表名,在您的情况下(单表继承)是entities
  2. 不,这些不会被合并。您可以创建两个关系,并有一个(混合)属性将两者结合起来,但这仅用于阅读目的,因为当您想修改此属性(例如, add Transits)时,您仍然需要同时指定两者边(startend)。
  3. 我不确定我是否理解这里的问题

update-1:根据评论中的要求,Concrete-Table 继承代码如下:

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 回答