2010-10-15 30 views
5

我想通過某個子查詢是否返回任何結果來過濾查詢集。在SQL中,可能如下所示:如何用Django中的「exists」「過濾」?

SELECT * FROM events e WHERE EXISTS 
    (SELECT * FROM tags t WHERE t.event_id = e.id AND t.text IN ("abc", "def")) 

換句話說,檢索所有使用指定標記之一標記的事件。

我該如何使用Django的QuerySet API在EventTag上表達這個問題?

回答

12

你可以做這樣的事情:

q = Event.objects.filter(tag__text__in = ['abc', 'def']) 

假設有一個ForeignKeyTagEvent

說明:您正在根據特定條件過濾Event對象。使用雙下劃線語法,您正在訪問Tag實例的text屬性,然後附加IN條件。您不必擔心外鍵加入; Django在幕後爲你做到了這一點。如果你是好奇,想看看生成的查詢,可以打印:

print q.query 
+0

謝謝馬諾,我似乎經常忘記嘗試「顯而易見」的Django和開始思考的東西是相當複雜的。 – 2010-10-15 17:29:04

5

馬諾的解決方案可能會導致當有一個事件的多個標籤的問題。

SQL內部聯接返回所有行,因此事件可能有重複的結果,解決方案是添加不同的方法。

q = Event.objects.filter(tag__text__in = ['abc', 'def']).distinct()