Получение количества объектов в наборе запросов в 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)
Это возвращает набор запросов со всеми голосами отдельно, но я хочу получить подсчет голосов за каждый элемент, кто-нибудь знает, как я могу это сделать? спасибо
Ответы
Ответ 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"))
Я не тестировал этот конкретный запрос, но это должно выводить количество элементов для каждого значения в конкурсах в качестве словаря.