【问题标题】:Django DB API equivalent of a somewhat complex SQL queryDjango DB API 相当于一个有点复杂的 SQL 查询
【发布时间】:2010-11-25 11:03:58
【问题描述】:

我是 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); 

提前谢谢你!

【问题讨论】:

    标签: sql django


    【解决方案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)
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 感谢您的回答,但这不是我需要的。我不想为每个对话手动获取值,因为我需要单个 Django 查询来进行以后的分页。
      猜你喜欢
      • 1970-01-01
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 2015-07-13
      • 2015-12-23
      相关资源
      最近更新 更多