在 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 的查询集中获取对象的计数的主要内容,如果未能解决你的问题,请参考以下文章