2016-06-28 36 views
5

私は 'StoreItem'というモデルと 'QuoteItem'というモデルを持っています。 QuoteItemはStoreItemをポイントします。django annotate - 条件付きカウント

私は、いくつの見積もりアイテムが店舗アイテムを指し示しているが、見積もりアイテムに適用するための条件を付けるかのカウンタに注釈を付けることを試みています。

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

'アイテム' はStoreItemsのクエリセットです:

私はこのような何かを試してみました。 'this_week'は今週を表す日付のリストです(これが私が適用しようとしているフィルタです)。私は日付のものを動作させた後、この条件付きカウントにさらにフィルタを追加したいが、それを開始することができます。私が取得していますどのようなとにかく

は、より多くのブールのようなものです - 条件が存在する一致引用項目は、関係なく、私が持っているどのように多く、カウンタは他1.できなくなります場合は、0

なりに見えますCount(Case())のようにアイテムが存在するかどうかだけチェックし、そうであれば1を返します。ストアアイテムをポイントするすべてのクォートアイテムを繰り返し処理し、条件に一致する場合はカウントします(個別に)。

どうすればいいですか?

答えて

7

あなたは(私はすべてのCount作品、それが少し奇妙見つける。)の代わりにCountSum文の中ですべてのものをラップする必要があります。

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

これは基本的にのためにすべての0 sおよび1秒を加算内側のCaseステートメントは、一致の数をカウントします。

0

私も同様の作業をしていました。私にとっては、Case/Whenを超えるSumは、私が参加していたテーブルの数(数を超えていたため)で動作しませんでした。このように終わった:itemsはどちらかitemgroupまたは直接を通じてquoteitemsに関連させることができると仮定すると

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

:私の場合は

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

私は実際には2 Countは以下のように一緒にね追加する必要がありました。