1. ホーム
  2. django

[解決済み] django でクエリセット内のオブジェクトの数を取得する

2023-04-22 09:46:02

質問

データベースにオブジェクトの数を表示するフィールドを追加するにはどうしたらよいでしょうか。私は以下のモデルを持っています。

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)

これは、すべての投票を個別に含むクエリセットを返しますが、私は各項目のカウント投票を取得したいのですが、誰かそれを行うことができる方法を知っていますか? ありがとうございます。

どのように解決するのですか?

特定の項目の投票数を取得するには、次のようにします。

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

これは、アイテムと投票数を対応させる辞書を作成します。これが唯一の方法というわけではありませんが、データベースのヒット数がかなり少ないので、かなり速く実行されるでしょう。