我有一个模型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

最佳答案

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


更新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")

08-04 21:02