我正在尝试通过辅助(多对多)表使用自定义条件编写带外连接的查询。我在找出正确的语法时遇到了麻烦。
假设我有那些项目和标签表, 他们之间有多对多的关系:
item_to_tag_table = Table('item_to_tag', Base.metadata,
Column('item_id', Integer, ForeignKey('item.id')),
Column('tag_id', Integer, ForeignKey('tag.id')))
在Item中具有以下关系:
class Item(Base):
id = Column(Integer, primary_key=True)
tags = relationship("Tag",
secondary = item_to_tag_table,
backref = "items",
)
我想查询不包含特定标记的项目,因此我需要使用外部联接。
如果标签只链接到1个项目,我可以这样做:
DBSession.query(Items)\
.outerjoin(Tag, and_(Tag.itemId == Item.id, Tag.name == "foo"))\
.having(func.count(Tag.id) < 1)
但是,对于多对多的关系,我无法确定正确的语法:
DBSession.query(Items)\
.outerjoin(Tag, and_( ?? , Tag.name == "foo"))\
.having(func.count(Tag.id) < 1)
有什么想法吗?我是否必须创建2个外连接,一个连接到辅助表,另一个连接到Tag表?
提前致谢!
答案 0 :(得分:3)
在你的例子中,你不需要使用outerjoin,你只需要表达式(条件之前的“〜”)。
要过滤多对多关系,请使用.any()
DBSession.query(Items)\
.join(Tag)\
.filter(~Item.tags.any(name="foo"))