Django DB API相当于一个有点复杂的SQL查询

时间:2009-09-03 22:02:48

标签: sql django

我是Django的新手,但在简单查询方面仍有一些问题。

我们假设我正在写一个电子邮件应用程序。这是邮件 模型:


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,用于标识一组电子邮件 写的和回复。现在,为了在收件箱中列出电子邮件,我 希望gmail只显示每个对话的最后一封电子邮件。

我有SQL等效的工作,但是如何为此构建原生Django查询?


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

提前谢谢!

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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查询不同。您的查询似乎提供了来自每个对话的最新消息。这提供了来自一个特定对话的最新消息。您始终可以执行一个查询来获取该用户的会话列表,然后跟进多个查询以获取每个会话的最新消息。