2011-02-04 10 views
14

Desidero recuperare una somma di due campi (che sono le aggregazioni stesse) per ciascun oggetto in una tabella.Utilizzo di .extra() nei campi creati da .annotate() in Django

Di seguito può descrivere un po 'meglio quello che sto cercando, ma si traduce in un Unknown column in field list -Errore:

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

Ho anche provato ad utilizzare F() per le ricerche sul campo, ma che mi dà un'istruzione SQL non valida .

Tutte le idee su come risolvere questo sono molto apprezzate.

+0

Sei sicuro che l'errore "colonna sconosciuta" si riferisce a "extra" anziché a "annotate"? Mostra il traceback, per favore. –

+0

La query funziona correttamente quando si utilizza solo "annotate": entrambe le somme vengono aggiunte come campi agli oggetti restituiti. Solo quando viene usato "extra", viene sollevata l'eccezione. – jnns

+1

+1: avendo lo stesso problema, ancora non ha trovato una soluzione! –

risposta

4

è questo quello che vuoi?

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

È passato un po 'di tempo da quando ho avuto questo problema, ma questa sembra una soluzione adeguata! Grazie. – jnns

+1

Non riesco a farlo per molte o molte relazioni. –

+0

Hii è possibile aggiungere condizioni all'interno della SUM ?? per esempio '' 'SUM (relatedModel__someField = True)' '' –

0

Per farlo funzionare per molti a molti o molti a uno (Reverse) le relazioni, è possibile utilizzare il seguente:

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

Ma questo si romperà anche se avete bisogno di un altro annotate, come per un conteggio, poiché extra aggiungerà l'istruzione alla clausola GROUP BY, mentre le funzioni aggregate non sono consentite.

Problemi correlati