Django ORM - 具有不同选择子句的分组聚合

2023-12-15

假设我们有 Django ORM 模型Meetup具有以下定义:

class Meetup(models.Model):
    language = models.CharField()
    speaker = models.CharField()
    date = models.DateField(auto_now=True)

我想用一个single查询以获取语言、说话者和日期 每种语言的最新活动。

>>> Meetup.objects.create(language='python', speaker='mike')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='python', speaker='ryan')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='node', speaker='noah')
<Meetup: Meetup object>
>>> Meetup.objects.create(language='node', speaker='shawn')
<Meetup: Meetup object>
>>> Meetup.objects.values("language").annotate(latest_date=models.Max("date")).values("language", "speaker", "latest_date")
[
    {'speaker': u'mike', 'language': u'python', 'latest_date': ...}, 
    {'speaker': u'ryan', 'language': u'python', 'latest_date': ...}, 
    {'speaker': u'noah', 'language': u'node', 'latest_date': ...}, 
    {'speaker': u'shawn', 'language': u'node', 'latest_date': ...}, 
]

噢!我们正在获取最新事件,但分组错误!

看来我需要一种方法GROUP BY the language but SELECT在不同的 字段集?


Update- 这种查询似乎很容易用 SQL 表达:

SELECT language, speaker, MAX(date)
FROM app_meetup
GROUP BY language;

我想要一种不使用 Django 的方法来做到这一点raw()- 是否可以?

Update 2- 经过大量搜索,似乎也有类似的问题:

  • 获取最新对象的 Django Query
  • 如何在 Django 中进行每组最大 n 查询
  • MySQL 将此类查询称为特定列的分组最大值.

Update 3- 最后,在@danihp的帮助下,这似乎是你能做的最好的事情 是两个查询。我使用了以下方法:

# Abuse the fact that the latest Meetup always has a higher PK to build
# a ValuesList of the latest Meetups grouped by "language".
latest_meetup_pks = (Meetup.objects.values("language")
                                   .annotate(latest_pk=Max("pk"))
                                   .values_list("latest_pk", flat=True))

# Use a second query to grab those latest Meetups!
Meetup.objects.filter(pk__in=latest_meetup_pks)

这个问题是我之前问题的后续:

Django ORM - 获取组的最新记录


这是一种很容易解释但很难编写的查询。如果这是 SQL,我会向您建议一个 CTE 过滤查询,其中按日期排序的语言对分区进行行排名 ( desc )

但这不是 SQL,这是 django 查询 api。简单的方法是对每种语言进行查询:

languages = Meetup.objects.values("language", flat = True).distinct.order_by()
last_by_language = [  Meetup
                     .objects
                     .filter( language = l )
                     .latest( 'date' )
                     for l in languages
                    ]

如果某些语言没有会议,则会崩溃。 另一种方法是获取每种语言的所有最大数据:

last_dates = ( Meetup
             .objects
             .values("language")
             .annotate(ldate=models.Max("date"))
             .order_by() )

q= reduce(lambda q,meetup: 
     q | ( Q( language = meetup["language"] ) & Q( date = meetup["ldate"] ) ), 
     last_dates, Q())  

your_query = Meetup.objects.filter(q)

也许有人可以解释如何在没有原始 sql 的情况下在单个查询中执行此操作。

Edited应有的OP评论

您正在寻找:

"SELECT language, speaker, MAX(date) FROM app_meetup GROUP BY language"

并非所有 RDBMS 都支持此表达式,因为所有未包含在 select 子句中的聚合函数中的字段都应出现在 group by 子句中。就你而言,speaker位于 select 子句(无聚合函数)上,但未出现在 group by 中。

在 mysql 中,它们不是显示结果的保证speaker那场比赛是max date。因此,我们面临的查询并不容易。

Quoting MySQL 文档:

在标准 SQL 中,包含 GROUP BY 子句的查询不能引用 选择列表中未命名的非聚合列 GROUP BY 子句...然而,这主要在所有值都有用时有用 在 GROUP BY 中未命名的每个非聚合列中都是相同的 对于每个组。

符合您要求的最接近的查询是:

Reults = (   Meetup
             .objects
             .values("language","speaker")
             .annotate(ldate=models.Max("date"))
             .order_by() )
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django ORM - 具有不同选择子句的分组聚合 的相关文章

随机推荐

  • Spark / Scala:用最后的良好观察填充 nan

    我正在使用 Spark 2 0 1 并希望用列中最后一个已知的值填充 nan 值 我能找到的唯一关于火花的参考Spark Scala 使用最后一次观察进行前向填充 or 用 pyspark 之前已知的良好值填充 null似乎使用RDD 我宁
  • 使用“command”和“bind”参数调用函数

    我想指出的是 我学习Python的时间很短 这个问题是针对初学者的 我需要在程序顶部的菜单中添加命令 这将调用函数 color picker red kolory add command label Czerwony command col
  • 无法将类型 System.Collections.Generic.List 隐式转换为 System.Collections.Generic.List [重复]

    这个问题在这里已经有答案了 我需要一个抽象类 其中包含一个方法来返回从基类或接口派生的项目列表 我的代码如下 public abstract class Template this should return the data to be
  • 一个 Web 应用程序下有多个 Facebook 应用程序

    我正在尝试将 umbraco cms 用于一些 Facebook 应用程序 我的想法是让每个 facebook 应用程序都在 umbraco 的 aspx 页面中 这些 应用程序 非常简单 只有几张图片 也许每个应用程序都有一个民意调查 但
  • SQL - 在不存在的地方插入

    我有一个我认为完全微不足道的查询 如果不存在具有匹配 ID 的值 则将值插入表中 BEGIN INSERT INTO dbo Contact Categories Contact Category ID Description VALUES
  • 如何在 spring bean 中获取 HttpServletRequest?

    我正在开发一个具有基于 Flex 的前端和 Spring Hibernate 后端的应用程序 为了让 Facebook 集成按照我目前的方式工作 我需要在后端读取前端 javascript 中设置的 cookie 并在登录期间进行一些验证
  • 如何在函数运行期间忽略所有用户输入?

    我有一个 Python 模块 它使用 pynput 侦听组合键 然后 一旦按下它 它就会在文本程序中键入一个字符串 效果很好 除了 在下面的示例中 用户的组合键设置为 shift space 这很有意义 并且可能是运行我的程序的 Windo
  • 我可以像 Joe Belfiore 一样在 Windows Phone 7 上使用“演示者模式”来进行应用程序演示吗?

    我希望能够在手机 电脑屏幕或投影仪上显示发生的情况 这似乎是可能的 因为微软在他们所有的演示中都做到了这一点 但我似乎不知道如何做到 例如 我构建了一个应用程序 我想向一屋子的潜在客户演示它 在演示过程中我不能很好地使用模拟器 我希望房间里
  • 从 PHP 插入时在 MongoDB 上执行 JS

    使用 mongo shell 时 我可以运行如下命令 db sandbox insert line db eval storedFunction or db sandbox insert line function return 1337
  • 如何使用 render(:update) 和 Replace_html 重新加载 div?

    如何仅重新加载页面上的 div id 我只需要重新加载某个div 在我的控制器中我有 def mycontrolleraction render update do page reload only the div adiv control
  • C++中删除指针

    背景 我正在努力理解指针 几周前我们在学校才看到它们 今天练习时我遇到了一个愚蠢的 问题 这对你来说可能非常简单 但我几乎没有编程经验 我在 SO 中看到了很多关于删除指针的问题 但它们似乎都与删除类而不是 简单 指针 或任何正确的术语 有
  • JavaScript - 通过 JavaScript 访问网络选项卡 [重复]

    这个问题在这里已经有答案了 我需要访问 例如 Chrome 开发者工具网络选项卡JavaScript 我只需要 1 源名称 第 1 列 和2 类型 第 3 列 但我完全不知道该怎么做 非常感谢链接 提前致谢 我做了一些研究 但似乎你做不到
  • 列表视图中的居中文本

    我发现不可能将文本在列表视图中居中 尝试在几乎所有内容上尝试wrapp content和layout gravity center 但文本不会移动 这是我的班级代理Eco package com blabla import java tex
  • 如何通过void指针访问成员

    首先尝试编写一个小程序将基本算术翻译成英语 最后我构建了一个二叉树 这不可避免地非常不平衡 来表示求值的顺序 首先 我写了 struct expr typedef struct unsigned char entity flag posit
  • 通过ObjectOutputStream发送文件然后用Java保存它?

    我有这个简单的服务器 客户端应用程序 我试图让服务器通过 OutputStream FileOutputStream OutputStream ObjectOutputStream 等 发送文件 并在将其保存到实际文件之前在客户端接收它 问
  • 'this' 绑定到订阅函数而不是 Angular2 中的外部组件范围

    我在 Angular2 中的一个组件中遇到了问题 因为 this 在我的组件之一中绑定到了错误的上下文 我有其他组件没有发生此问题 但我看不出有什么区别 这是我的代码 成分 import Component Input from angul
  • python闭包中的cell_contents

    python 中的 cell contents 对闭包的调用是否发生了变化 我知道 func closure 不起作用并且 closure works func closure cell contents Traceback most re
  • 带有逻辑或的 IF 语句[重复]

    这个问题在这里已经有答案了 if 1 2 4 cout lt lt True else cout lt lt False 我就是这样读到上面的内容的 如果 1 等于 2 或 4 则打印 true 否则 打印 false 当执行此操作时 tr
  • Hadoop 2.4 无法执行目标 org.apache.maven.plugins:maven-antrun-plugin:1.7

    我正在尝试从源代码安装 Hadoop 2 4 0 出现以下错误 我用 google 搜索但找不到任何解决方案 请帮忙 Regards 操作系统 Ubuntu 12 04 64 位 Java java版本 1 6 0 45 协议 版本 lib
  • Django ORM - 具有不同选择子句的分组聚合

    假设我们有 Django ORM 模型Meetup具有以下定义 class Meetup models Model language models CharField speaker models CharField date models