在Django中由.annotate()创建的字段上使用.extra()

时间:2011-02-04 14:20:43

标签: django django-queryset

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

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

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

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

非常感谢任何关于如何解决这个问题的想法。

2 个答案:

答案 0 :(得分:6)

这就是你想要的?

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

答案 1 :(得分:0)

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

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

但如果你需要另一个注释,例如count,那么这也会破坏,因为extra会将语句添加到GROUP BY子句中,而不允许使用聚合函数。