我是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);
提前谢谢你!
发布于 2009-09-04 09:12:53
这行得通吗?这将需要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)
发布于 2009-09-03 22:20:42
因此,给定一个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查询不同。您的查询显示为提供来自每个对话的最新消息。这提供了来自一个特定会话的最新消息。您可以始终执行一次查询来获取该用户的对话列表,然后执行多个查询以从每个对话中获取最新消息。
https://stackoverflow.com/questions/1376202
复制相似问题