2009-08-06 64 views
3

這PostgreSQL的查詢解決我的問題,但我不知道如何把它在Django ORM。Django的ORM GROUP BY

SELECT DISTINCT ON (to_email) * FROM (SELECT * FROM invitation_invitation ORDER BY date_invited DESC) AS sub 

從項目清單,我想爲「to_email」列所有不同行,並在to_email是重複的,就應該選擇最新的(date_invited)

回答

3

這裏的overview on doing aggregation in Django ORM,並專門values功能。

UPDATE: 爲了把它放在行動,類似的東西

Invitation.objects.values('to_email').annotate(date_invited=Max('date_invited')) 

應該爲你的榜樣工作。

UPDATE 2: Ferran是對的,它只會檢索to_email字段和date_invited註釋。如果其他信息是必需的,那麼在Python中執行「最新」過濾可能是最簡單的。建議的解決方案更適合於您最初僅顯示僅包含摘要數據的列表,並根據請求提供更多詳細信息(假設摘要數據足以唯一標識記錄)。

+0

如果我遍歷由你提出什麼返回的查詢集,我可以得到一個邀請對象與我聯繫,這是最簡單的方法W/O進入自定義的SQL,所以我會跟你的答案去了。 我想到的是讓所有對象在Python列表,從列表中刪除重複的另一種選擇。我不確定它是更慢還是更快。 – Tudorizer 2009-08-09 11:16:32

1

我想用Django的ORM只有一個查詢,你不能做到這一點。 ORM不會做這種子查詢。 您可以使用連接對象並自己編寫SQL,或者創建子查詢並使用python代碼獲取DISTINCT步驟。

編輯

漢克同志提出的解決方案是好的,但只得到了date_invitedto_email領域和問的一個問題是,以獲取最新記錄的所有字段。