2014-10-29 46 views
2

我有一個Message類,它有fromUser,toUser,textcreatedAt字段。如何在Django中創建對話收件箱

我想模仿whatsapp或iMessage或任何SMS收件箱,這意味着我想獲取每個對話的最後一條消息。

我想:

messages = Message.objects.order_by('createdAt').distinct('fromUser', 'toUser') 

但是,這並不因爲SELECT DISTINCT ON expressions must match initial ORDER BY expressions錯誤工作。

我真的不明白是什麼意思,我也試過:

messages = Message.objects.order_by('fromUser','toUser','createdAt').distinct('fromUser', 'toUser') 

等,但讓我不顯然毫無意義的代碼段在這裏模糊了真正的主題。我怎樣才能達到這個基本或更好的說,一般衆所周知的結果?

回答

2

你的第二種方法是正確的。 From the Django docs

當您指定字段名稱,則必須提供的查詢集的ORDER_BY(),並在ORDER_BY(領域)必須在不同的領域(),以同樣的順序啓動。

例如,SELECT DISTINCT ON(a)爲您提供第a列中每個值的第一行。如果你沒有指定一個訂單,你會得到一些任意的行。

這意味着您必須在您要在distinct()方法中使用的order_by()方法中包含相同的列。事實上,你的第二個查詢正確包括列在ORDER_BY()方法:

messages = Message.objects.order_by('fromUser','toUser','createdAt').distinct('fromUser', 'toUser') 

爲了獲取最新記錄,你需要降序訂購createdAt列。指定此順序的方法是在order_by()方法(there is an example of this in the docs here)的列名稱中包括一個減號。下面是你應該用它來獲得最新的優先順序您的郵件列表的最終形式:

messages = Message.objects.order_by('fromUser','toUser','-createdAt').distinct('fromUser', 'toUser') 
+0

這是奇怪的,我敢發誓我買了一個錯誤:P反正它的工作,謝謝! – EralpB 2014-10-29 22:17:55