pythondjangocountdjango-queryset

How to get the count of objects in a queryset? (Django)


How can I add a field for the count of related objects?

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

To find the votes for contestA:

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

which returns a queryset with all of the votes. How do I get the count of related votes for each Item?


Solution

  • To get the number of votes for a specific item, you would use:

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

    If you wanted a break down of the distribution of votes in a particular contest, I would do something like the following:

    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
    

    This will create dictionary that maps items to number of votes. Not the only way to do this, but it's pretty light on database hits, so will run pretty quickly.