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

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

Следующее может описать немного лучше то, что я после, но приводит к 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 ответа

Решение

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

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

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

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

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

Другие вопросы по тегам