Получение количества объектов в наборе запросов в Django - PullRequest
44 голосов
/ 26 марта 2011

Как добавить поле для подсчета объектов в базе данных. У меня есть следующие модели:

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

Чтобы найти голоса для конкурса А, я использую следующий запрос на мой взгляд

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

Это возвращает набор запросов со всеми голосами в отдельности, но я хочу получить количество голосов для каждого элемента, кто-нибудь знает, как я могу это сделать? спасибо

Ответы [ 2 ]

79 голосов
/ 08 апреля 2011

Чтобы получить количество голосов за определенный элемент, вы должны использовать:

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

Это создаст словарь, который отображает элементы в число голосов.Это не единственный способ сделать это, но он довольно легок в обращениях к базе данных, поэтому будет работать довольно быстро.

10 голосов
/ 27 ноября 2014

Другой способ сделать это - использовать Агрегация .Вы должны быть в состоянии достичь аналогичного результата, используя один запрос.Например:

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

Я не проверял этот конкретный запрос, но при этом в качестве словаря должен выводиться счетчик элементов для каждого значения в конкурсах.

...