5

Djangoの注釈機能を使用して、関連するモデルのカウントをクエリセットに追加しようとしています。ただし、関連するオブジェクトを完全にカウントする必要はありません。アクティブなオブジェクトのみをカウントする必要があります(つまり、「is_active = True」)。カウントを絞り込む方法がわかりません。

(簡略化された)関連モデル:

class Post(models.Model):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=80)
    body = models.TextField()

class Comment(models.Model):
    user = models.ForeignKey(User)
    post = models.ForeignKey(Post)
    comment_body = models.CharField(max_length=80)
    is_active = models.BooleanField(default=True)

ビューで、クエリセットに注釈を付けようとしています。

queryset=Post.objects.all().annotate(num_comments=Count('comment', distinct=True))

上記は投稿に関連するすべてのコメントをカウントしますが、私は「is_active」コメントのみをカウントしたいと思います。GoogleとDjangoのドキュメントはここでは役に立ちません。誰かがこの問題を抱えて解決しましたか?

4

3 に答える 3

5

is_active注釈を付ける前に、フィルタリングする必要があります。

Post.objects.filter(comment__is_active=True).annotate(num_comments=Count('comment'))

こちらの説明をご覧ください。

于 2010-09-29T18:13:13.863 に答える
3

これは、投稿クエリセットのアクティブなコメントの数に「注釈を付ける」必要がある方法です。

Post.objects.extra(select={"num_comments":
     """
     SELECT COUNT(myapp_comment.id) FROM myapp_reply
     WHERE myapp_comment.is_active='1' AND 
     myapp_comment.post_id = myapp_post.id
     """
     },)

きれいではありませんが、動作します。上記のコメントで述べたように、組み込みの集計関数annotate()を使用することはできませんでした。これは、関連するすべてのコメントをカウントし、アクティブな関連するコメントのみをカウントしたかったためです。

ダニエルのソリューションは、コメントのない投稿を除外したため、機能しませんでした。投稿を除外したくありません。非アクティブなコメントだけを除外します。

誰かがより良い解決策を持っているなら、私は喜んで賛成票を投じてあなたにベストアンサーを送ります!

于 2010-09-30T18:50:32.713 に答える
3

使用しているデータベースに基づいて、2つのバリエーションがあります。MySQLを使用する場合、ソリューションはシンプルでエレガントです。

Post.objects.annotate(num_comments=Sum('comment.is_active'))

これが機能するのは、データベースのブールフィールドが整数であり、Trueが1、Falseが0であるためです。

ただし、これはMySQLのみ機能し、ブールフィールドでのみ機能します。すべてのデータベースで機能し、より複雑なチェックを実行できるジョブを実行するためのより一般的な方法は、小さな「ハッキー」を挿入した小さなSQLを使用することです。

Post.objects.annotate(num_comments=Count('comment',
    field='CASE WHEN myapp_comment.is_active THEN 1 END'))

私の個人的なブログでも同じ問題があり、それが解決策でした。そのためのブログ投稿を書いています。http://venelin.sytes.net/blog/django/filtrirane-na-agregirash-count-v-django/。ブルガリア語ですが、私のサイトではグーグル翻訳を使用しています。翻訳はあまり良くありませんが、なぜこれが機能するのかを理解するのに役立つかもしれません。

于 2013-06-14T07:08:33.273 に答える