2013-04-10 47 views
1

我有一個項目和標籤m2m關係。我希望能夠創建一個動態AND查詢來獲取每個列出標籤的項目。SQLalchemy + Flask:動態AND查詢

這是一個工作示例,但我希望它是動態的(隨機數量的標籤)。

return Item.query.filter(Item.item_tag.any(name = 'test'))\ 
.filter(Item.item_tag.any(name = 'tag'))\ 
.filter(Item.item_tag.any(name = 'tag1'))\ 
.filter(Item.item_tag.any(name = 'tag2'))\ 
.all() 

這是or_工作示例:

tags = or_(*[Tag.name==x for x in tags]) 
return Item.query.join(Tag.items).filter(tags).all() 

我正在尋找一個類似的東西。

編輯:對工作和解決方案生成的SQL是:

SELECT item.id AS item_id, item.title AS item_title, item.url AS item_url, item.body AS item_body, item.itempic AS item_itempic, item.time_published AS item_time_published, item.private AS item_private, item.user_id AS item_user_id FROM item WHERE (EXISTS (SELECT 1 FROM item_tag, tag WHERE item.id = item_tag.item_id AND tag.id = item_tag.tag_id AND tag.name = ?)) AND (EXISTS (SELECT 1 FROM item_tag, tag WHERE item.id = item_tag.item_id AND tag.id = item_tag.tag_id AND tag.name = ?)) 

EDIT2:什麼,我需要

例:項目1具有標籤:標籤1,標籤2,標籤3。 Item2具有標籤:tag1,tag2,tag3,tag4。

當搜索標籤:tag1,tag2,tag3。 item1和item2都被返回。在搜索標籤時:tag1,tag2,tag3,tag4。只有item2被返回。

回答

2

也許我缺少明顯的,但:

tags = and_(*[Tag.name==x for x in tags]) 
return Item.query.join(Tag.items).filter(tags).all() 

參考這樣:http://docs.sqlalchemy.org/en/rel_0_8/core/expression_api.html#sqlalchemy.sql.expression.and_

+0

當我使用該查詢時,它會嘗試查找具有多個名稱的標籤(我認爲)。 這是該查詢生成的SQL: SELECT item.id AS ITEM_ID,item.title AS ITEM_TITLE,item.url AS item_url,item.body AS item_body,item.itempic AS item_itempic,item.time_published AS item_time_published ,item.private AS item_private,item.user_id AS item_user_id FROM標籤JOIN item_tag AS item_tag_1 ON tag.id = item_tag_1.tag_id JOIN item ON item.id = item_tag_1.item_id WHERE tag.name =? AND tag.name =? – cancerballs 2013-04-10 18:10:10

-2

我不知道你的措辭你的問題很清楚。

爲什麼要過濾然後遍歷任何標籤?爲什麼不只是Item.query.all()(如果你需要一個隨機集,然後使用隨機模塊和.choice()來選擇一些返回項)?

也許我誤解了一些東西。從來沒有需要這種查詢。

+0

所以我應該查詢所有的項目,然後在Python代碼中執行搜索邏輯?我會在我的原始問題中添加一個例子來澄清這一點。 – cancerballs 2013-04-13 11:15:43