2011-02-04 9 views
14

Chcę pobrać sumę dwóch pól (które same są agregacją) dla każdego obiektu w tabeli.Korzystanie z .extra() na polach utworzonych przez .annotate() w Django

Mogą opisać trochę lepiej co jestem po, lecz skutkuje Unknown column in field list -Error:

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

Próbowałem też za pomocą F() dla wyszukiwań polowych, ale to daje mi nieprawidłową instrukcję SQL .

Wszelkie pomysły na rozwiązanie tego problemu są bardzo cenne.

+0

Czy jesteś pewien, że błąd "nieznanej kolumny" odnosi się do "ekstra" zamiast "adnotacji"? Pokaż ślad, proszę. –

+0

Zapytanie działa poprawnie, gdy używana jest tylko opcja "adnotacja": obie sumy są dodawane jako zmienne do zwróconych obiektów. Tylko w przypadku użycia 'extra', wyjątek jest podnoszony. – jnns

+1

+1: mając ten sam problem, wciąż nie znalazłem rozwiązania! –

Odpowiedz

4

to, czego chcesz?

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

Minęło trochę czasu odkąd wpadłem na ten problem, ale wydaje się, że to właściwe rozwiązanie! Dziękuję Ci. – jnns

+1

Nie jestem w stanie tego zrobić dla wielu do wielu relacji. –

+0

Hii czy można dodać warunek do SUMY? na przykład '' 'SUM (relatedModel__someField = True)' '' –

0

Aby pracować dla wielu do wielu lub wiele do jednego (wsteczny) relacji, można użyć następujących:

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

Ale to złamie także jeśli potrzebujesz innego opisywanie, jak dla count, ponieważ extra doda instrukcję do klauzuli GROUP BY, podczas gdy funkcje agregujące nie są tam dozwolone.