Использование.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, тогда как агрегатные функции там не допускаются.