5

次のモデルがあります。

class VotingRound(models.Model):
     pass # here are some unimportant fields

class Vote(models.Model):
     voting_round = models.ForeignKey(VotingRound)
     vote = models.CharField(choices=...)

これで、VotingRound のインスタンスができました。各値が何回表されたかを知りたいと思います。これは collections.Counter を介して簡単に実行できます。

>>> Counter(voting_round_instance.vote_set.values_list('vote', flat=True))
Counter({u'decline': 8, u'neutral': 5, u'approve': 4})

Djangoの集計技術でこれを行う方法があるかどうか知りたい....

このモジュールを見つけましたが、使用する前に、それを行うネイティブな方法があるかどうかを知りたいと思いました。

4

1 に答える 1

9

はい、できます!

from django.db.models import Count
voting_round_instance.vote_set.values('vote') \
    .annotate(count=Count('vote')).distinct()

編集:使用order_by()

また、デフォルトの順序が集計を台無しにしないようにする必要がある場合もあります。これは、関連するオブジェクト マネージャを使用する場合に特に当てはまります。

https://docs.djangoproject.com/en/1.8/topics/db/aggregation/#interaction-with-default-ordering-or-order-by

queryset の order_by() 部分で言及されている (またはモデルのデフォルトの順序付けで使用されている) フィールドは、values() 呼び出しで特に指定されていない場合でも、出力データを選択するときに使用されます。これらの追加フィールドは、「類似」の結果をグループ化するために使用され、他の点では同一の結果行が別々に表示されるようにすることができます。これは、特に物を数えるときに現れます。

from django.db.models import Count
voting_round_instance.vote_set.values('vote') \
    .annotate(count=Count('vote')) \
    .distinct().order_by()
于 2015-04-24T02:35:31.657 に答える