[英]Sqlalchemy: Outer join with custom condition through a secondary table
我正在嘗試通過輔助表(多對多)使用自定義條件編寫具有外部聯接的查詢。 我在弄清楚正確的語法時遇到了麻煩。
假設我有那些Item和Tag表,它們之間存在多對多關系:
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表?
提前致謝!
在您的示例中,您不需要使用externaljoin,僅需要NOT表達式(條件前為“〜”)。
要過濾多對多關系,請使用.any()
DBSession.query(Items)\
.join(Tag)\
.filter(~Item.tags.any(name="foo"))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.