2009-09-03 102 views
2

我是Django的新手,仍然有一些關於簡單查詢的問題。Django DB API相當於一個有點複雜的SQL查詢

讓我們假設我正在寫郵件應用程序。這是郵件 型號:


class Mail(models.Model): 
    to = models.ForeignKey(User, related_name = "to") 
    sender = models.ForeignKey(User, related_name = "sender") 
    subject = models.CharField() 
    conversation_id = models.IntegerField() 
    read = models.BooleanField() 
    message = models.TextField() 
    sent_time = models.DateTimeField(auto_now_add = True) 

每封郵件已經conversation_id標識一組電子郵件 這是寫和葉回答的。現在,爲了在收件箱中列出電子郵件,I 希望作爲gmail僅顯示每個對話的最後一封電子郵件。

我有相當於SQL的工作,但如何構建本地Django查詢呢?


select 
     * 
from 
     main_intermail 
where 
     id in 
     (select 
       max(id) 
     from 
       main_intermail 
     group by conversation_id); 

預先感謝您!

回答

1

這是行不通的?這將需要Django 1.1。

from django.db.models import Max 
mail_list = Mail.objects.values('conversation_id').annotate(Max('id')) 
conversation_id_list = mail_list.values_list('id__max',flat=True) 
conversation_list = Mail.objects.filter(id__in=conversation_id_list) 
+0

謝謝大衛!它完美無瑕! – edkirin 2009-09-04 09:23:17

0

因此,給定一個conversation_id您想檢索id最高的相關記錄。爲此,請使用order_by按降序對結果進行排序(因爲您希望最高的id排在第一位),然後使用數組語法獲取第一個項目,這將是具有最高id的項目。

# Get latest message for conversation #42 
Mail.objects.filter(conversation_id__exact=42).order_by('-id')[0] 

但是,這與您的SQL查詢不同。您的查詢似乎會提供來自的每個對話的最新消息。這提供了來自特定對話的最新消息。您始終可以執行一個查詢以獲取該用戶的對話列表,然後跟進多個查詢以獲取每個對話的最新消息。

+0

感謝您的回答,但這不是我所需要的。我不想爲每個對話手動獲取值,因爲我需要單獨的Django查詢以供以後分頁。 – edkirin 2009-09-04 07:35:19