2014-06-23 57 views
1

從多對多博客和標籤模型和從Querying a many-to-many relationship in SQLAlchemy查詢,我知道session.query(Blog).join(Blog.tags).options(contains_eager(Blog.tags)).filter(Blog.tags.in_(list_of_relevant_tags)).all()會給我所有的博客文章,至少有一個list_of_relevant_tags中的標籤,並且這些標籤已經被查詢並返回。SQLAlchemy:過濾多對多,但返回所有結果

我看到的潛在問題(我在測試時遇到了問題)是如果我想獲取返回的博客上的標籤列表。我想返回所有的標籤,但生成的SQL會表明,至多需要第二次查詢。最糟糕的情況是,SQLA只會返回與列表匹配的標籤。

有沒有辦法在ORM中提交此查詢以返回匹配的博客帖子以及所有他們的標籤在一個數據庫中被擊中?

+0

我不認爲你有你害怕的問題。 * join *和* filter *將使用完全不同的對象。如果您不舒服,只需爲此場景創建一個測試用例。 – van

回答

0

我想出了一些東西。不過,這感覺就像是一種解決方法。有一個更直接的方法來與ORM做到這一點。

基本上,您使用的關聯表的子查詢(讓我們分別稱之爲BlogTag與列blog_idtag_id,是外鍵blogs.idtags.id)產生的blog_id s表示符合標籤標準的列表。然後,您內部加入該列表blog_id s到另一個未經過濾的查詢Blog加入Tag以僅返回相關的Blog s。

t = session.query(BlogTag.blog_id).filter(BlogTag.tag_id.in_(list_of_relevant_tags)).\ 
    group_by(BlogTag.blog_id).subquery('t') 
blogs = session.query(Blog).join(Blog.tags).join(t, t.c.blog_id == Blog.id).\ 
    options(contains_eager(Blog.tags)).all() 
相關問題