Использование .extra() в полях, созданных .annotate() в Django

Я хочу получить сумму из двух полей (которые являются самими агрегациями) для каждого объекта в таблице.

Ниже описывается немного лучше того, что мне нужно, но результат 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.

Любые идеи о том, как решить эту проблему, очень ценятся.

Ответы

Ответ 1

это то, что вы хотите?

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

Ответ 2

Чтобы заставить его работать для многих или для многих (обратных) отношений, вы можете использовать следующее:

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

Но это также сломается, если вам понадобится другой аннотат, например, для подсчета, потому что дополнительная добавит оператор в предложение GROUP BY, тогда как агрегированные функции там не разрешены.