【问题标题】:Many to many relationship with additional filters on the middle table与中间表上的附加过滤器的多对多关系
【发布时间】:2014-08-18 01:55:19
【问题描述】:

我有一个类似下面的架构:

CREATE TABLE user (id integer, name text); CREATE TABLE link (id1 integer, id2 integer, type integer); CREATE TABLE address (id integer, address text);

link 表是一个通用连接表:我们使用type 列来限制两个实体之间的连接(例如,type=1001 表示用户到地址的关系)。 我想使用 SQLAlchemy 表达以下查询:

SELECT * FROM user JOIN link ON link.id1 = user.id AND link.type = 1001 JOIN address ON address.id = link.id2

就是这样,在关系的辅助连接参数中声明附加过滤器(即link.type = 1001)。

我有以下 SQLAlchemy 定义:

link = Table('link', db.metadata, Column('id1', INTEGER(), ForeignKey('core_user.user_id')), Column('id2', INTEGER(), ForeignKey('core_comm.id')), Column('type', INTEGER()) )

class User(db.Model): __tablename__ = 'user' __schema__ = 'public' id = Column('id', INTEGER(), primary_key=True) name = Column('name', TEXT()) addresses = relationship('Address', secondary=link)

class Address(db.Model): __tablename__ = 'address' __schema__ = 'public' id = Column(INTEGER(), primary_key=True) address = Column(Text())

它在 3 个表之间正确连接,我得到记录,但我找不到在辅助连接上应用其他过滤器的方法。我什至不确定这是正确的方法。

理想情况下,我想在 User 对象中获得一个 addresses 字段,这将是 Address 对象的列表,可能会被反向引用。

有什么提示吗? 谢谢!

【问题讨论】:

    标签: python sqlalchemy


    【解决方案1】:

    阅读文档的Specifying Alternate Join Conditions 部分。下面的代码应该做到这一点:

    addresses = relationship('Address',
            secondary=link,
            primaryjoin=id==link.c.id1,
            secondaryjoin="and_(link.c.id2 == Address.id, link.c.type == 1001)",
            backref="users",
            )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 2020-05-01
      • 1970-01-01
      • 2016-06-28
      • 2012-11-10
      相关资源
      最近更新 更多