当前位置: 首页 > 面试题库 >

Django聚合带有表达式的查询

闻华容
2023-03-14
问题内容

我有一个XYZ模型,我需要获取给定查询集的字段a,b和表达式x / y的最大值。

它适用于田野。就像是:

>>> XYZ.all().aggregate(Max('a'))

... {'a__max': 10}

但是,我找不到一种针对表达式的方法。尝试类似的东西:

>>> XYZ.all().aggregate(Max('x/y'))

给出一个错误:

*** FieldError: Cannot resolve keyword 'x/y' into field. Choices are: a, b, x, y, id

尝试类似的东西:

>>> XYZ.all().aggregate(Max(F('x')/F('y')))

给出一个错误:

*** AttributeError: 'ExpressionNode' object has no attribute 'split'

甚至像:

XYZ.all().extra(select={'z':'x/y'}).aggregate(Max('z'))

同样不起作用,并给出与上述相同的错误:

FieldError: Cannot resolve keyword 'z' into field. Choices are: a, b, x, y, id

我发现可以做到的一个技巧是:

XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z

之所以有效,是因为它会生成正确的SQL,但令人困惑,因为我确实在z属性处获得了正确的值,但没有获得正确的实例(具有该最大值的实例)。

当然,我也可以将原始查询或技巧与extra()和order_by()一起使用,但是对我而言,Django一直以一种不错的方式支持聚合查询是没有意义的,但不能支持表达式,甚至具有自己的F表达式。

有什么办法吗?


问题答案:

在SQL中,您想要的实际上是

SELECT x/y, * FROM XYZ ORDER BY x/y DESC LIMIT 1;
# Or more verbose version of the #1
SELECT x/y, id, a, b, x, y FROM XYZ GROUP BY x/y, id, a, b, x, y ORDER BY x/y DESC LIMIT 1;
# Or
SELECT * FROM XYZ WHERE x/y = (SELECT MAX(x/y) FROM XYZ) LIMIT 1;

因此,在Django ORM中:

XYZ.objects.extra(select={'z':'x/y'}).order_by('-z')[0]
# Or
XYZ.objects.extra(select={'z':'x/y'}).annotate().order_by('-z')[0]
# Or x/y=z => x=y*z
XYZ.objects.filter(x=models.F('y') * XYZ.objects.extra(select={'z':'MAX(x/y)'})[0].z)[0]

版本号

XYZ.all().extra(select={'z':'MAX(x/y)'})[0].z

因为没有正确的X,Y和实例MAX功能的所有行中进行评估,当没有GROUP BY,因此在返回的查询集所有实例将具有相同价值zMAX(x/y)



 类似资料:
  • 我试图用聚合物表达式来显示某些东西。 我有一个文件,它打印出json_encoded数组,例如名称。在我看来,有三种可能性: null

  • 问题内容: 我本来希望以下查询返回所有带有各自子代的人。 但是实际上,它的确是相反的。我想不出无需额外的CTE就能进行正确嵌套的方法。有办法吗? 示例数据 结果 预期结果 问题答案: 该rCTE从另一侧遍历树: SQL提琴。 使用到每个节点聚集多个分支外。 与您期望的结果之间的微小差异: 这包括在列中。 没有将单个节点包装到数组中。 都可以进行调整,但是我希望结果对您来说是可以的。

  • 问题内容: 我的存储过程有问题。 我收到错误消息: 无法对包含聚合或子查询的表达式执行聚合功能 这是我认为发生错误的存储过程的一部分: 谢谢你。 问题答案: 如果您无论如何都要避免相关的子查询,通常可以得到更好的性能: 假设在Products表中最多只能有一个匹配项(Products,而不是Table_Products- 当然是一个表,因此不要在名称中加上该匹配项)。换句话说,如果product是

  • 我是聚合框架的新手,有以下问题。 我的收藏是这样的: 用户 ActivitiesFeed 活动 聚合函数 如何使用第一个查找结果进行查找? 我查阅了activities集合。此集合保存第二个查找BaseData.UserID的id。但是使用这种方法,第二次查找没有结果。 我对activities集合进行连接的原因是actionID可以保存来自另一个集合的用户id或文档id。它取决于activiti

  • 问题内容: 这是我目前最喜欢使用的一项前沿功能,并且很快就会消失。我想将子查询聚合注释到现有查询集上。在1.11之前执行此操作意味着自定义SQL或修改数据库。这是this的文档以及其中的示例: 他们在总体上进行注释,这对我来说似乎很奇怪,但是无论如何。 我正在为此而苦苦挣扎,所以我将其沸腾回到我拥有数据的最简单的真实示例中。我有,其中包含许多Space。使用会使你更快乐,但是-暂时-我仅想使用 注