在django中获取查询集中的对象计数

时间:2011-03-26 02:04:25

标签: django django-models django-queryset

如何为数据库中的对象计数添加字段。我有以下型号:

class Item(models.Model):
    name = models.CharField()

class Contest(models.Model);
    name = models.CharField()

class Votes(models.Model):
    user = models.ForeignKey(User)
    item = models.ForeignKey(Item)
    contest = models.ForeignKey(Contest)
    comment = models.TextField()

要查找竞选A的投票,我在我的视图中使用以下查询

current_vote = Item.objects.filter(votes__contest=contestA)

这将返回一个单独包含所有投票的查询集,但我想获得每个项目的计票投票,任何人都知道我该怎么做?感谢

3 个答案:

答案 0 :(得分:76)

要获得特定项目的投票数,您可以使用:

vote_count = Item.objects.filter(votes__contest=contestA).count()

如果您希望在特定比赛中分析投票分配,我会做以下事情:

contest = Contest.objects.get(pk=contest_id)
votes   = contest.votes_set.select_related()

vote_counts = {}

for vote in votes:
  if not vote_counts.has_key(vote.item.id):
    vote_counts[vote.item.id] = {
      'item': vote.item,
      'count': 0
    }

  vote_counts[vote.item.id]['count'] += 1

这将创建将项目映射到投票数量的字典。不是这样做的唯一方法,但它对数据库命中很轻,所以会很快运行。

答案 1 :(得分:10)

另一种方法是使用Aggregation。您应该能够使用单个查询获得类似的结果。比如这个:

Item.objects.values("contest").annotate(Count("id"))

我没有测试这个特定的查询,但是这应该作为字典输出竞赛中每个值的项目计数。

答案 2 :(得分:0)

使用相关名称为特定比赛计票

class Item(models.Model):
    name = models.CharField()

class Contest(models.Model);
    name = models.CharField()

class Votes(models.Model):
    user = models.ForeignKey(User)
    item = models.ForeignKey(Item)
    contest = models.ForeignKey(Contest, related_name="contest_votes")
    comment = models.TextField()

>>> comments = Contest.objects.get(id=contest_id).contest_votes.count()