【问题标题】:Django ORM GROUP BYDjango ORM 分组
【发布时间】:2010-11-17 07:48:40
【问题描述】:

这个 PostgreSQL 查询解决了我的问题,但我不确定如何将它放入 Django ORM。

SELECT DISTINCT ON (to_email) * FROM (SELECT * FROM invitation_invitation ORDER BY date_invited DESC) AS sub

从项目列表中,我想要“to_email”列的所有不同行,并且 to_email 重复的地方,它应该选择最新的( date_invited )

【问题讨论】:

    标签: django orm


    【解决方案1】:

    这是overview on doing aggregation in Django ORM,特别是values 功能。

    更新: 把它付诸实践,类似于

    Invitation.objects.values('to_email').annotate(date_invited=Max('date_invited'))
    

    应该适用于您的示例。

    更新 2: Ferran 是对的,这只会检索 to_email 字段和 date_invited 注释。如果立即需要其他信息,那么在 Python 中进行“仅最新”过滤可能是最简单的。建议的解决方案更适合您最初显示仅包含摘要数据的列表并根据请求提供更多详细信息(假设摘要数据足以唯一标识记录)的情况。

    【讨论】:

    • 如果我遍历您提出的返回的 QuerySet,我可以获得一个 Invitation 对象,并且我管理这是不使用自定义 SQL 的最简单方法,所以我会接受您的回答目前。我想到的另一个选项是获取 Python 列表中的所有对象并从列表中删除重复项。我不确定它是慢还是快。
    【解决方案2】:

    我认为你不能用 django ORM 只用一个查询来做到这一点。 ORM 不会产生这种子查询。 您可以使用连接对象并自己编写 SQL 或创建子查询并使用 python 代码获取 DISTINCT 步骤。

    编辑

    Hank Gay 提出的解决方案是可以的,但是只获取 date_invitedto_email 字段,而提出的问题是获取最新记录的所有字段。 p>

    【讨论】:

      猜你喜欢
      • 2017-03-30
      • 2012-04-26
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2016-09-25
      • 1970-01-01
      相关资源
      最近更新 更多