python - SQLALchemy中如何在具有多个连接路径的表上建立双向关系?
问题描述
sqlalchemy 文档中给出的示例是,
from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
Base = declarative_base()
class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String)
billing_address_id = Column(Integer, ForeignKey("address.id"))
shipping_address_id = Column(Integer, ForeignKey("address.id"))
billing_address = relationship("Address", foreign_keys=[billing_address_id])
shipping_address = relationship("Address", foreign_keys=[shipping_address_id])
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
street = Column(String)
city = Column(String)
state = Column(String)
zip = Column(String)
我正在尝试一个类似的例子(不能在这里放置这么多代码)如果我做类似的事情它就不起作用:
from sqlalchemy import Integer, ForeignKey, String, Column
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
Base = declarative_base()
class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String)
billing_address_id = Column(Integer, ForeignKey("address.id"))
shipping_address_id = Column(Integer, ForeignKey("address.id"))
billing_address = relationship("Address", foreign_keys=[billing_address_id], back_populates('bill_addr'))
shipping_address = relationship("Address", foreign_keys=[shipping_address_id], back_populates('ship_addr'))
class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
street = Column(String)
city = Column(String)
state = Column(String)
zip = Column(String)
bill_addr = relationship("Customer", back_populates('billing_address'))
ship_addr = relationship("Customer", back_populates('shipping_address'))
我有两个疑问:
Q1)上述关系是双向的吗?
Q2) 如何在具有多个连接路径的表之间建立双向关系?
编辑:就我而言,我收到以下错误:
sqlalchemy.exc.AmbiguousForeignKeysError
sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables
on relationship User.expenses - there are multiple foreign key paths linking the tables.
Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a
foreign key reference to the parent table.
解决方案
如果我使用“backref”而不是“back_populates”,它会起作用。我将“backref”放在两个外键都存在的一侧的关系中,并删除了另一张表上的关系。
推荐阅读
- python - 将新列迭代地添加到具有唯一列名的数据框中
- java - Error using Rational Asset Manager with Oracle 11g
- web-crawler - 如何使用 robots.txt 处理不同子域的网络抓取 - 允许 abc.sample.com 但不允许 cde.sample.com
- postgresql - Postgres:if-else 条件取决于提示,在通过 \i 调用的 .sql 文件中
- pandas - 如何在熊猫中创建多索引数据框?
- python - 为什么我不能在 Django orm 中从我的数据库中检索日期时间值?
- omnipay - 我正在尝试将cyberSource 与omnipay 库集成。但是没有生成reference_number请求参数
- reactjs - 读取反应函数内的标签主体
- laravel - 如何设置/获取复选框的值
- android - 无法通过 StickyRecyclerView 中的即将到来的标题数据推送标题数据