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)''}, )