2011-05-17 16 views
9

Estoy tratando de encontrar una manera de tomar una anotación sobre dos campos en un modelo agregado. Algo así como:Anotación de Django en el campo agregado con extra

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 produce el error "No se puede resolver la palabra clave 'TOTAL_AMOUNT' en el campo" Ya he probado la solución indicada aquí: Using .aggregate() on a value introduced using .extra(select={...}) in a Django Query? Sin embargo no hubo suerte aún así obtener la "no puede resolver palabra clave 'total_amount' en el campo "

Cualquier 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 excluidas ya realizadas, lo que hace que esa 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.

+0

' 'total_heal'' no se menciona en la consulta, espero que quiere decir' total_amount' –

+0

tengo? estado teniendo el mismo problema recientemente. De las preguntas anteriores parece que esto solía funcionar antes - ¿es posible (por diseño o por accidente) que se eliminó en las versiones posteriores? El problema aparentemente no está en el Cláusula SQL, pero en la función aggregate(), ya que funciona bien si invoco directamente la propiedad queryset.total_amount. –

Respuesta

1

intentar algo como esto:

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

De acuerdo con la respuesta a https://stackoverflow.com/a/4348728/122033 (en realidad en los comentarios): "Django, por supuesto, pasa el fullName como un alias, que no funciona con MySQL" - y no creo que sea con SQLite, que he estado usando. :(

1

creo que es mejor anotación de usuario para obtener el valor 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') 
Cuestiones relacionadas