结合关系

时间:2012-05-04 02:56:15

标签: python sqlalchemy flask flask-sqlalchemy

我有一个模型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也有一些关于距离和可防御性的内容,但这与此无关。

  • 首先,由于使用单表继承来Zone Entity的子类,我可以引用zones.id吗?
  • 其次,Zone.routes属性合并Transit.startTransit.end

1 个答案:

答案 0 :(得分:1)

  1. 不,你需要使用表名,在你的情况下(单表继承)是entities
  2. 不,这些不会合并。你可以创建两个关系,并且有一个(hybrid)属性可以将两者结合起来,但这只是为了阅读目的,就像你想要修改这个属性一样(例如,添加Transits),你会仍然需要指定双方(startend)。
  3. 我不确定我理解这里的问题
  4. update-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")