python - sqlalchemy中使用M2M Table和关系获取特定数据

标签 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或者可以编写函数,但有没有办法在单个 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 关系的一部分。


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

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

相关文章:

python - 从范围在python中创建字典对象

python - 通过 PySide 设置 QTreeWidget 中标题的光标

python - 无法获得 ANN 的隐藏层激活

python - 如何使用 Django 的 ORM 截断表?

python - SQLalchemy 查询获取字典的聚合数组

python - web.py 和 gunicorn

java - 在 WebLogic 中运行时出现 ClassNotFoundException (HqlToken)

c# - Entity Framework .Remove() 与 .DeleteObject()

python - flake8 在过滤器子句中提示 bool 比较 "=="

sqlalchemy - 无法在 sqlalchemy 中对 @hybrid_property 应用过滤器