通过多个模型(表)的SQLAlchemy关系或association_proxy

问题描述 投票:0回答:2

我有几个表,以一对多关系连接成一条链(名称改为强调,有一条链):

国家<- City <- Street <- House

我需要在 House 模型中有一个属性才能访问它只有一个国家/地区。

街道与房屋通过关系连接,城市与街道、乡村与城市连接。有一个绝对清晰的链条。 我已经遇到了连接 House 和 City 的问题,但使用 Association_proxy 解决了它:

class House(db.Model):
    ...
    street= db.relationship('Street', foreign_keys='House.street_id', backref='streets')
    city = association_proxy('street', 'city')

class Street(db.Model):
        ...
        city = db.relationship('City', foreign_keys='Street.city_id', backref='streets')

class City(db.Model):
        ...
        country = db.relationship('Country', foreign_keys='City.country_id', backref='cities')

但这些都没有帮助我将国家与家庭联系起来。 我需要按国家/地区进行过滤,因此 @property 没有帮助。 是的,似乎在 SQLAlchemy 中没有实现按 Association_proxy 或关系进行过滤(我有一个异常),但我也已经解决了它,创建了特殊的方法来过滤。 Association_proxy 似乎只使用两个模型名称:第一个作为直接目标,第二个作为最终目标。或者有什么办法可以使用更多?

我也确实找到了关系文档的一部分“复合“辅助”连接”,但它似乎用于更困难的情况(我不明白,为什么C表中应该有a_id,我不明白)城市中没有 House_id,并且认为没有必要)。还是我错过了什么?

所以现在我需要一种使用其中一种方法从 House 获取 Country 的方法。有没有办法使用多个模型作为代理或通过它们建立直接关系? 我在文档中没有找到很好的解释。可以吗?

python flask-sqlalchemy relationship
2个回答
0
投票
我没有找到最终的解决方案,但得到了一些建议,这些建议并不完美,但可能会解决某些情况下的问题...

  1. 创建具有多对多关系的附加关联表。 例如,具有此类列的关联表:

    id - Country_id - city_id - street_id - house_id(house_id 是唯一的)。

在这种情况下,我们很可能为任何房屋找到一个城市或国家。


0
投票
    如果我们处理对象,而不是模型,@property 可以为我们提供一个国家/地区: @财产 默认国家(自己): 返回 db.session.query(House).filter(House.id==self.id).join(Street).filter(Street.id==House.street_id).join(City).filter(City.id= =Street.street_id).join(Country).filter(Country.id==City.country_id).first().country
© www.soinside.com 2019 - 2024. All rights reserved.