首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django DB API相当于一个有点复杂的SQL查询

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

Stack Overflow用户
提问于 2009-09-03 22:02:48
回答 2查看 322关注 0票数 2

我是Django的新手,对于简单的查询仍然有一些问题。

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

代码语言:javascript
运行
复制
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查询来完成这项工作?

代码语言:javascript
运行
复制
select
        *
from
        main_intermail
where
        id in
        (select
                max(id)
        from
                main_intermail
        group by conversation_id); 

提前谢谢你!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-04 09:12:53

这行得通吗?这将需要Django 1.1。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2009-09-03 22:20:42

因此,给定一个conversation_id,您希望检索具有最高id的相关记录。为此,使用order_by按降序对结果进行排序(因为您希望最高的id在前面),然后使用数组语法获得第一个项目,这将是具有最高id的项目。

代码语言:javascript
运行
复制
# Get latest message for conversation #42
Mail.objects.filter(conversation_id__exact=42).order_by('-id')[0]

但是,这与您的SQL查询不同。您的查询显示为提供来自每个对话的最新消息。这提供了来自一个特定会话的最新消息。您可以始终执行一次查询来获取该用户的对话列表,然后执行多个查询以从每个对话中获取最新消息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1376202

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档