使用M2M表和关系来获取sqlalchemy中的特定数据

时间:2012-01-19 06:51:49

标签: python orm sqlalchemy relation

我有桌子

# 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次操作中合并Classand_属性?

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

谢谢你的帮助。

1 个答案:

答案 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中使用==而不是=。但这并没有解决问题。