【问题标题】:SQLAlchemy two relationships to same tableSQLAlchemy 两个关系到同一个表
【发布时间】:2021-03-20 21:17:20
【问题描述】:

我正在尝试做的事情可能很简单,但我至少花了几个小时来解决这个问题,我可能只是在这里过于复杂了,但我希望得到一些帮助,加分细化。

注意:我已阅读此内容,并尝试根据接受的答案整合我认为对我来说解决方案的内容,但由于某种原因我仍然无法解决此问题

class Orders(db.Model)
    id = db.Column(db.Integer, primary_key=True)
    dest_address = db.relationship('Address', backref='orders')
    from_address = db.relationship('Address', backref='orders')

class Address(db.Model)
    id = db.Column(db.Integer, primary_key=True)
    order_id = db.Column(db.Integer, db.ForeignKey('orders.id'))

所以基本上,我想要一个特定模型中的 2 个单独的一对一关系,每个关系指向同一个模型,我不完全确定如何正确地做到这一点

我尝试将is_dest_address = db.Column(db.Boolean, default=True) 字段添加到我的地址类并在关系中指定primaryjoin 条件,以及在关系中定义foreign_keys 参数(foreign_keys 参数为Address.id

但我不完全确定如何正确执行此操作。

另外,值得一提的是,我的User 模型与Orders 模型有关系,也与Address 模型有关系

我也试过这个,感觉是我试过的所有东西中最接近的:

class Address(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    is_dest_address = db.Column(db.Boolean, default=True)

class Orders(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    dest_address_id = db.Column(db.Integer, db.ForeignKey('address.id'))
    from_address_id = db.Column(db.Integer, db.ForeignKey('address.id'))
    dest_address = db.relationship('Address', backref='orders', uselist=False, foreign_keys=[dest_address_id])
    from_address = db.relationship('Address', backref='orders', uselist=False, foreign_keys=[from_address_id])

我得到这个错误: sqlalchemy.exc.AmbiguousForeignKeysError:无法确定关系 Orders.from_address 上的父/子表之间的连接条件 - 有多个外键路径链接表。指定 'foreign_keys' 参数,提供应计为包含对父表的外键引用的列的列表。

理想情况下,我可以只使用后一个代码并指定 primaryjoin 或类似的东西,以根据 is_dest_address 是否为真/假来确定哪个地址存储为哪个字段/关系

注意:据我所知,我正在做的正是文档中所说的 https://docs.sqlalchemy.org/en/14/orm/join_conditions.html

【问题讨论】:

  • 我仍然不确定如何解决这个问题,我尝试将 2 个外键指定为数据库字段,以及让关系指向这些外键,但我仍然收到错误消息.我假设解决方案相当简单,但由于某种原因我没有得到它。我还查看了许多类似的 SO 帖子,并尝试在我的上下文中实施这些解决方案,但我还没有找到不会给我错误的解决方案。

标签: flask orm sqlalchemy foreign-keys flask-sqlalchemy


【解决方案1】:

解决了

class Orders(db.Model):
  dest_address = db.relationship('Address', backref='orders_dest_address')
  from_address = db.relationship('Address', backref='orders_from_address')

class Address(db.Model):
  order_id = db.Column(db.Integer, db.ForeignKey('orders.id'))

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2020-12-23
    • 1970-01-01
    相关资源
    最近更新 更多