Подтвердить что ты не робот

Получение количества объектов в наборе запросов в 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)

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

4b9b3361

Ответ 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"))

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