2010-10-02 115 views
1

我正在寫一個簡單的使用Django的私人信使,並正在實施消息線程。Django集團通過

每個系列的消息和回覆將有一個唯一的thread_id,這將允許我將消息串組合在一起。但是,在收件箱視圖中,所有消息都顯示出來了,我只想按thread_id進行分組,因此儘管線程可能有20條消息,但它只會在收件箱中顯示一次。

這將會是一個非常簡單的

SELECT msg_id, msg_text, subject, from_user_id, to_user_id, date_time, is_read, 
thread_id WHERE to_user_id='foo' GROUP BY thread_id FROM inbox_message; 

不過,我似乎無法使用Django的ORM

任何想法來執行呢?

+0

什麼是錯誤信息?在您的文章中,SQL缺少一個FROM子句... – ars 2010-10-02 04:52:03

+0

whoops - 錯誤不在SQL語句本身。它在Django中不起作用,原因如下 – 2010-10-02 05:04:32

回答

1

你想用這個SQL語句實現什麼?

它將在一些DBMS(即MySQL)上工作,但它不合法。當您使用GROUP BY語句時,您可以只選擇您正在分組的列,並彙總(SUM,AVG,COUNT等)。其他列是禁止的,因爲DBMS不知道什麼數據返回(即它應該返回第一個消息的主題,第二個或什麼?)。

如果你不想對線程進行一些總結,除了計算消息,最好的解決方案是給thread表添加新列(你有thread表嗎?)。

+0

啊,我明白了。是的,這個查詢在MySQL上工作,這就是爲什麼我認爲它是有效的。基本上我所做的只是列出消息,所以我關心的是任何消息的主題行,因爲它在答覆中保持不變。沒有線程表..我只是在相關消息中添加thread_id(例如回覆父消息),並根據消息是否具有相同的thread_id來將消息串聯在一起。有沒有什麼辦法可以完成我想要做的事情,而無需添加某種父/子標誌或線程表?理論上我應該能夠通過thread_id進行分組,對嗎? – 2010-10-02 04:53:26

+0

是的,問題出在我的數據模型中。感謝您的幫助 – 2010-10-02 05:09:39

+0

如果您確定您的主題完全相同,您可以將其添加到GROUP BY:GROUP BY thread_id,subject。如果你有GROUP BY中的主題,你也可以在SELECT中使用它。但是這個解決方案很糟糕,因爲你有數據冗餘。有兩個很好的解決方案:1.添加線程模型,並在那裏移動主題。 2.添加reply_to列(然後您可以使用'reply_to爲NULL'在線程中搜索第一條消息並刪除'thread_id'列。 – 2010-10-02 05:28:38