繁体   English   中英

获取 Django 中查询集中对象的计数

[英]Getting a count of objects in a queryset in Django

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

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

为了找到 contestA 的选票,我在我看来使用以下查询

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

这会返回一个单独包含所有选票的查询集,但我想获得每个项目的计票,有人知道我该怎么做吗? 谢谢

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

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

这将创建将项目映射到投票数的字典。 这不是唯一的方法,但它对数据库命中率非常低,因此运行速度非常快。

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

from django.db.models import Count

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

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

使用相关名称计算特定比赛的选票

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

您可以使用len()来获取contestA 的票数

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

实际上, len()select_for_update()一起使用,如下所示:

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

因为select_for_update()不适用于count() ,如下所示:

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

你可以看到我的回答解释了select_for_update()count()len()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM