Skip to main content
 首页 » 编程设计

python之组合关系

2025年05月04日11lidabo

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

请您参考如下方法:

  1. 不,您需要使用表名,在您的情况下(单表继承)是 entities
  2. 不,这些不会被合并。您可以创建两个关系,并有一个(混合)属性将两者结合起来,但这仅用于阅读目的,因为当您想要修改此属性时(例如,添加 Transits) ,您仍然需要指定双方(start 和 end)。
  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")