2016-06-15 22 views
0

における特定の選択肢の出現回数を数える:は、私は次のモデルを持っているモデル

class Team(models.Model): 
    # stuff 
class Event(models.Model): 
    # stuff 
class Award(models.Model): 
    award_type_choices = (
     (1, "some string"), # a lot of these 
     (2, "some other str"), 
    ) 
    award_type = models.CharField(choices=award_type_choices) 
    specific_choices = (
     (1, "some string"), # etc 
     # only a few of these, but all of these can be found inside award_type_choices. 
    ) 

    event = models.ForeignKey(Event) 
    recipients = models.ManyToManyField(Team) 

私は回数Teamの数がspecific_choices列の下に収まる賞を獲得した注釈を付ける/カウントしようとしています。私はこのコードのビットを通じて賞を受賞しているフィルタチームができます。

reversed_choices = dict((v, k) for k, v in Award.specific_choices) 
Team.objects.filter(award__award_type__in=reversed_choices.values()) 

はしかし、私はこれらを数えるアプローチすべきかわかりません。私は少し前にCountF、およびExpressionWrapperを少し使ったことがありますが、バットからすぐにこれをどうやって行うのかを広く知っているわけではありません。

すなわち、私はCountオブジェクトにfilterと同じパラメータを投げることによって、それに近づくことができ考え出し、しかし、すぐに私はそれを入力として、私はそれが動作しません実現:

Team.objects.annotate(num_specifics=Count('award__award_type__in=Award.specific_choices')) 

これですべてのヘルプを感謝されます。

答えて

0

これを解決するのに役立つConditional AggregationについていくつかのDjangoドキュメントが見つかりました。

def most_specifics(): 
    reverse_specs = dict((v, k) for k, v in Award.specific_choices) 
    return Team.objects.annotate(
     c=Sum(
      Case(
       When(award__award_type__in=reverse_specs.values(), then=1), 
       default=0, 
       output_field=PositiveSmallIntegerField(), 
      ) 
     ) 
    ).order_by('-c') 
1
choices = Award.specific_choices.all() 

c = Team.objects.filter(award__award_type__in=choices).count() 
+0

申し訳ありませんが、私は十分に明確だったとは思いません。私は 'specific_choices'フィールドの一部である' Award'を何回持っているかをフィールドで各チームに「注釈を付ける」ことを考えています。さらに、 'specific_choices'は、' int、str'タプルを内部に持つシーケンスです。その上で 'all()'を呼び出すことはできません。 – Justin

+0

それは単なるTeam.objects.annotate(num_specifics = c)です。ここで、cは上記の戻り値です。 – dmitryro

+0

これは動作しません。 AFAIK、あなたは注釈の中にクエリーを置くことはできません。さらに、それがしているのは、どれだけ多くのチームが勝ったかではなく、それらの特定の賞を獲得したチーム数です。私は後者を探しています。あなたはDjangoのORMはあなたのspecific_choicesに遭遇する場合 – Justin

0

次のコードでは、与えられたモデルの特定の分野で多くの選択肢があります:

my_field=Model._meta.get_field('field_name') 

length=len(my_field.choices._display_map) 
関連する問題