我有桌子
# 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或者可以编写该函数,但有没有办法在单Table
次操作中合并Class
和and_
属性?
注意:Address.py和Account.py都是不同的文件,由于周期依赖,我无法导入其他模型中的任何模型
谢谢你的帮助。
答案 0 :(得分:4)
无需导入即可使用:
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]
关系,仍然检查引用的{{1} }也是Address
MN关系的一部分。
在旁注中,输入错误:在您的(注释)代码中,您应该在Account.addresses
中使用==
而不是=
。但这并没有解决问题。