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