我有一个模型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
吗?其次,
Zone.routes
属性是否会合并Transit.start
和Transit.end
? 最佳答案
否,您需要使用表名,在您的情况下(单表继承)为entities
不,这些不会合并。您可以创建两个关系,并具有将两者结合的(混合)属性,但这仅出于阅读目的,因为当您想要修改此属性(例如,添加Transits
)时,仍然需要指定两侧(start
和end
)。
我不确定我是否理解这里的问题
更新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")