【问题标题】:Use of M2M Table and relationship to get specific data in sqlalchemysqlalchemy中使用M2M表和关系获取具体数据
【发布时间】:2012-01-19 06:51:49
【问题描述】:

我有桌子

# 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 都是不同的文件,由于循环依赖,我无法在其他模型中导入任何模型

谢谢你的帮助。

【问题讨论】:

    标签: python orm sqlalchemy relation


    【解决方案1】:

    这无需导入即可工作:

    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'" 中的=。但这并不能解决问题。

    【讨论】:

    • 谢谢@van 这对我有用:)。我期待你是第一个从那里得到答案的人;)。
    • @Lafada:太棒了!是的,使用 SO 来关注 SA 主题。
    猜你喜欢
    • 2022-08-24
    • 2021-04-21
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 2020-08-03
    相关资源
    最近更新 更多