django annotations aggregation extra

Anotación de Django en el campo agregado con extra



group by django (3)

Creo que es mejor para la anotación del usuario obtener el valor de total_amount :

total_done = qs.values( ''ability__ability_name'', ).annotate( total_amount=F(''effective_value'') + F(''overage'') total=Sum(''total_amount''), ).values( ''ability__ability_name'', ''total_amount'' ).order_by(''-total_amount'')

Estoy tratando de encontrar una manera de tomar una anotación sobre dos campos en un modelo agregado. Algo como:

total_done = qs.values( ''ability__ability_name'', ).extra( select={ ''total_amount'': ''effective_value + overage'', } ).annotate( total=Sum(''total_amount''), ).values( ''ability__ability_name'', ''total_amount'' ).order_by(''-total_amount'')

Lo anterior no funciona y arroja el error "No se puede resolver la palabra clave ''total_amount'' en el campo" Ya probé la solución indicada aquí: Usando .aggregate () en un valor introducido usando .extra (select = {...}) en una consulta de Django? Sin embargo, aún no hay suerte de obtener la "palabra clave No se puede resolver ''total_amount'' en el campo"

Cualquier otra cosa que no sea realizar la consulta en sql en bruto, ya que la cadena de consulta que se está transfiriendo podría tener varios filtros y exclusiones ya ejecutados, lo que hace que la perspectiva sea un poco complicada. También trato de evitar agregar el campo al modelo real y calcular su valor durante el guardado a menos que sea la única forma.


De acuerdo con la respuesta a https://.com/a/4348728/122033 (en realidad en los comentarios): "Django, por supuesto, pasa el nombre completo como un alias, que no funciona con MySQL" - y mi suposición es que ninguno con SQLite, que he estado usando. :(


Pruebe algo como esto:

total_done = qs.extra(select = {''total_amount'': ''SUM(one_column + another_column)''}, )