我有表
# 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_
操作中组合 Table
和 Class
属性?
注意: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 关系的一部分。
顺便说一句,有一个拼写错误:在您的(注释的)代码中,您应该在 "Address.type='default 中使用
。但这并不能解决问题。==
而不是 =
'"
关于python - sqlalchemy中使用M2M Table和关系获取特定数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8922118/