2016-06-28 12 views
5

mam model o nazwie 'StoreItem' oraz model o nazwie 'QuoteItem'. Punkty QuoteItem na StoreItem.Django annotate - warunkowy Ilość

Próbuję opisywanie licznik, jak wiele elementów cytat wskazywać na przechowywania przedmiotów, ale warunki do zastosowania na elementach cytatu.

Próbowałem coś takiego:

items = items.annotate(
      quote_count=Count(
       Case(
        When(quoteitem__lookup_date__in=this_week, then=1), 
        output_field=IntegerField() 
       ) 
      ) 
     ) 

'przedmioty' są queryset z StoreItems. "this_week" to lista dat reprezentujących ten tydzień (filtr, który staram się zastosować). Po ustawieniu daty rzeczy działają, chcę dodać więcej filtrów do tej liczby warunkowej, ale zacznijmy od tego.

Zresztą co ja coraz bardziej przypomina Boolean - jeśli Cytuje Produkty spełniające warunek nie istnieje, nie ma znaczenia ile mam, licznik będzie 1. indziej, będzie 0.

Wygląda podobnie jak w przypadku Count(Case()) sprawdzaj tylko, czy istnieje jakiś element, a jeśli tak, zwróć 1, podczas gdy ja chcę, aby iterował on nad wszystkimi elementami wycen, które wskazują na element sklepu i policz je, jeśli pasują do warunku (pojedynczo).

Jak to się stało?

Odpowiedz

7

Trzeba zawinąć wszystko w Sum oświadczenia zamiast Count (uważam, że to trochę dziwne, że Count prace w ogóle):

from django.db.models import Case, IntegerField, Sum, When 

items = items.annotate(
     quote_count=Sum(
      Case(
       When(quoteitem__lookup_date__in=this_week, then=1), 
       output_field=IntegerField() 
      ) 
     ) 
    ) 

Zasadniczo sumuje wszystkie 0 s i 1 s dla wewnętrzne oświadczenie Case, w wyniku liczba liczba dopasowań.

0

Zrobiłem podobne zadanie. Dla mnie Sum nad Case/When nie działał ze względu na liczbę tabel, do których się przyłączyłem (było to drogie obliczanie). Skończyło się to tak:

from django.db.models import Case, IntegerField, Count, When, F 

items = items.annotate(
     quote_count=Count(
      Case(
       When(quoteitem__lookup_date__in=this_week, then=F('quoteitem__id'), 
      ), 
      distinct=True, 
     ) 
    ) 

W moim przypadku rzeczywiście musiałem dodać dwa Count y razem jak:

items = items.annotate(
     quote_count=Count(
      Case(
       When(quoteitem__lookup_date__in=this_week, then=F('quoteitem__id'), 
      ), 
      distinct=True, 
     ) 
    ) + Count (
      Case(
       When(itemgroup__lookup_date__in=this_week, then=F('itemgroup__quoteitem__id'), 
      ), 
      distinct=True, 
     ) 

Zakładając, że items mogą być związane z quoteitems albo poprzez itemgroup lub bezpośrednio.