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

在选择输出数据时使用查询集的 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 回答