与中间表上的其他过滤器有很多很多关系

时间:2014-08-16 20:11:59

标签: python sqlalchemy

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

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对象列表,可能会被反向引用。

任何提示? 谢谢!

1 个答案:

答案 0 :(得分:0)

阅读文档的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",
        )