2016-06-28 38 views
5

'StoreItem' adlı bir modelim ve 'QuoteItem' adında bir modelim var. Bir StoreItem üzerinde bir QuoteItem noktaları.django annotate - koşullu sayı

Kaç alıntı öğesinin mağaza öğelerini gösterdiğine ilişkin bir sayacı ek açıklama yapmaya çalışıyorum, ancak teklif öğelerinde uygulanacak koşullarla.

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

'ürün' StoreItems bir QuerySet şunlardır:

böyle bir şey denedik. 'this_week', bu haftayı temsil eden tarihlerin listesidir (uygulamak istediğim filtre budur). Tarihleri ​​işledikten sonra bu koşullu sayıya daha fazla filtre eklemek istiyorum ancak bununla başlayalım.

Neyse ne alıyorum mantıksal değer gibi daha - koşul olursa olsun kaç tane, var olan maç alıntı Ürünleri, sayaç başka 1. olacaksa, 0.

görünüyor olacak Count(Case()) gibi sadece herhangi bir öğenin mevcut olup olmadığını kontrol edin ve eğer geri dönerse 1, mağaza öğesinin üzerine işaret eden tüm alıntı öğeleri üzerinde yineleme yapmak ve durumu (tek tek) eşleştiğinde saymak istiyorum.

Nasıl yapabilirim?

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() 
      ) 
     ) 
    ) 

Bu temelde tüm 0 s ve 1 s ekler:

cevap

7

yerine Count bir Sum açıklamada şeyi sarmak gerekir (ı Count eserler hiç biraz garip bulmak) iç Case ifadesi, eşleşme sayısının bir sonucu olarak ortaya çıkar.

0

Benzer bir görev yapıyordum. Benim için Case/When üzerinden Sum10, katıldığım kaç tablodan dolayı çalışmıyordu (saymakla bitmek üzereydi). Böyle bitti:

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, 
     ) 
    ) 

Benim durumumda ben aslında ikisi birlikte Count eklemek s vardı gibi:

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, 
     ) 

itemsitemgroup veya doğrudan bir yoluyla ya quoteitems ilgili edilebileceğini varsayarsak.