gpt4 book ai didi

python - 在sqlalchemy中使用M2M Table和relationship获取具体数据

转载 作者:行者123 更新时间:2023-11-28 23:03:07 25 4
gpt4 key购买 nike

我有 table

# File : MyRelations.py
ACC_ADD_TABLE = Table('acc_add_rel', METADATA,
Column('acc_id', ForeignKey('acc.id'),
nullable=False),
Column('add_id', ForeignKey('address.id'),
nullable=False),
PrimaryKeyConstraint('add_id', 'acc_id'),
)

# File : Address.py
class Address(Base):
id = Column(Integer, primary_key=True,)
type = Column(String(length=10), nullable=False)

# File : Account.py
class Account(Base):
id = Column(Integer, primary_key=True,)
addresses = relationship('Address',
secondary=ACC_ADD_TABLE
)
# default_address = relationship('Address',
# secondary=ACC_ADD_TABLE,
# primaryjoin=and_("ACC_ADD_TABLE.add_id==Address.id",
# "ACC_ADD_TABLE.acc_id==Account.id",
# "Address.type='default'")
# )

根据示例,我想访问帐户中的所有默认地址。我可以使用 declared_attr或者可以编写函数,但是有没有办法在单个 and_ 操作中组合 TableClass 属性?

注意:Address.py 和 Account.py 都是不同的文件,由于循环依赖,我无法在其他模型中导入任何模型

谢谢你的帮助。

最佳答案

这不需要导入就可以工作:

default_address = relationship('Address',
secondary=ACC_ADD_TABLE,
primaryjoin="acc.c.id==acc_add_rel.c.acc_id",
secondaryjoin="and_(address.c.id==acc_add_rel.c.add_id, address.c.type=='default')",
#uselist = True,
)

如果您确定只有一个默认地址,您可以使用 uselist=True 以方便使用。
有时我更喜欢这种情况下的其他结构:向 Account 表添加一列:default_address_id 并构建 1-[0..1] 关系基于此列,仍然检查引用的 Address 是否也是 Account.addresses M-N 关系的一部分。


旁注,一个拼写错误:在您的(注释的)代码中,您应该使用 == 而不是 = in "Address.type='default '"。但这并不能解决问题。

关于python - 在sqlalchemy中使用M2M Table和relationship获取具体数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8922118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com