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

Posted

技术标签:

【中文标题】在 django 的查询集中获取对象的计数【英文标题】:Getting a count of objects in a queryset in django 【发布时间】:2011-07-23 07:58:23 【问题描述】:

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

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)

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

这仍然让我感到困惑。如果您在查询集上进行注释,您正在计算属于每个对象的 id 的数量,这显然是 1。那么这有什么帮助呢? 是的,如果您将 contest 计入竞赛模型中,情况就是如此。但是,在这种情况下,我们正在聚合 Item,它们有独特的比赛。 如果两个对象的计数相同,然后我们必须根据其他条件对它们进行排序。那该怎么做呢? @Tarun 您可以在注释中添加值,只要确保您不要尝试添加在注释期间聚合的项目。由于它返回一个查询集,所有常用的排序功能仍然适用.order_by('some_value')【参考方案3】:

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

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

【讨论】:

以上是关于在 django 的查询集中获取对象的计数的主要内容,如果未能解决你的问题,请参考以下文章

带有额外选择的 Django 查询集计数

Django 查询 - 在带注释的计数过滤器中获取父对象

Django - 每个不同状态的查询计数

在 Django shell 会话期间获取 SQL 查询计数

获取子查询的计数

在 Django 模板中获取 GAE 类 collection_name 的计数