【问题标题】:Using .extra() on fields created by .annotate() in Django在 Django 中由 .annotate() 创建的字段上使用 .extra()
【发布时间】:2011-06-21 09:42:59
【问题描述】:

我想为表中的每个对象检索两个字段的总和(它们本身就是聚合)。

以下内容可能会更好地描述我所追求的,但会导致Unknown column in field list-Error:

items = MyModel.objects.annotate(
                field1=Sum("relatedModel__someField"),
                field2=Sum("relatedModel__someField")).extra(
                        select={"sum_field1_field2": "field1 + field2"})

我也尝试使用 F() 进行字段查找,但这给了我一个无效的 sql 语句。

非常感谢任何有关如何解决此问题的想法。

【问题讨论】:

  • 您确定“未知列”错误是指extra 而不是annotate?请显示回溯。
  • 当只使用annotate 时查询运行良好:两个总和都作为字段添加到返回的对象中。只有在使用extra 时,才会引发异常。
  • +1 : 遇到同样的问题,还是没找到解决办法!

标签: django django-queryset


【解决方案1】:

这就是你想要的?

items = MyModel.objects.extra(
    select = {'sum_field1_field2': 'SUM(relatedModel__someField) + SUM(relatedModel__someField)'},
)

【讨论】:

  • 我已经有一段时间没有遇到这个问题了,但这似乎是一个合适的解决方案!谢谢。
  • 嗨,是否可以在 SUM 中添加条件?例如SUM(relatedModel__someField=True)
【解决方案2】:

要使其适用于多对多或多对一(反向)关系,您可以使用以下内容:

items = MyModel.objects.extra(
    select = {'sum_field1_field2': 'SUM("relatedModel"."someField") + SUM("relatedModel"."someField")'},
      )

但是,如果您需要另一个注解(例如计数),这也会中断,因为 extra 会将语句添加到 GROUP BY 子句中,而其中不允许使用聚合函数。

【讨论】:

    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 2021-07-12
    • 2011-07-08
    • 1970-01-01
    • 2016-11-28
    • 2019-01-15
    • 2016-10-19
    • 2015-11-03
    相关资源
    最近更新 更多