2011-02-04 8 views
14

Deseo recuperar una suma de dos campos (que son agregaciones) para cada objeto en una tabla.Usando .extra() en campos creados por .annotate() en Django

Lo siguiente puede describir un poco mejor lo que busco pero los resultados en un -Error Unknown column in field list:

items = MyModel.objects.annotate(
       field1=Sum("relatedModel__someField"), 
       field2=Sum("relatedModel__someField")).extra(
         select={"sum_field1_field2": "field1 + field2"}) 

También intentado usar F() para las operaciones de búsqueda de campo, pero eso me da una instrucción SQL no válida .

Cualquier idea sobre cómo resolver esto es muy apreciada.

+0

¿Estás seguro de que el error de "columna desconocida" se refiere a "extra" en lugar de a "anotación"? Muestra el rastreo, por favor. –

+0

La consulta se ejecuta correctamente cuando solo se usa 'annotate': ambas sumas se agregan como campos a los objetos devueltos. Solo cuando se usa 'extra', se genera la excepción. – jnns

+1

+1: teniendo el mismo problema, todavía no encontré una solución! –

Respuesta

4

¿esto es lo que quieres?

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

Ha pasado un tiempo desde que me encontré con este problema, pero esta parece ser una solución adecuada. Gracias. – jnns

+1

No puedo hacer esto para muchas o muchas relaciones. –

+0

Hii ¿es posible agregar condición dentro de la SUMA? por ejemplo '' 'SUM (relatedModel__someField = True)' '' –

0

para hacer que funcione para muchos a muchos o de muchos a uno las relaciones (hacia atrás), puede utilizar el siguiente:

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

pero esto va a romper también si necesita otra anotar, como para contar, porque extra agregará la declaración a la cláusula GROUP BY, mientras que las funciones agregadas no están permitidas allí.

Cuestiones relacionadas