単純なメッセージングシステムでは、ユーザーアクティビティの概要をテンプレートに記入する必要があります。各メッセージ送信者には、送信されるメッセージの数と個別の受信者の数が必要です。ここで私はSQLでそれを行うだろう方法ですDjango ORMバージョンのSQL COUNT(DISTINCT <column>)
class Message(models.Model):
sender = models.ForeignKey(User, related_name='messages_from')
recipient = models.ForeignKey(User, related_name='messages_to')
timestamp = models.DateTimeField(auto_now_add=True)
:
はここでモデルの簡易版です
SELECT sender_id, COUNT(id), COUNT(DISTINCT recipient_id)
FROM myapp_messages
GROUP BY sender_id;
私はORMクエリで集計上のドキュメントを読んされてきました、 annotate()は最初のCOUNT列を処理できますが、COUNT(DISTINCT)の結果を得る方法はありません(余分な(select = {})は動作していません。これはDjangoのORMクエリに変換できますか、それとも生のSQLを使用するだけですか?
[ ' .distinct() '](https://docs.djangoproject.com/ja/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct)filter might com eを手軽に。 –
COUNT(DISTINCT recipient_id)を無視すると、annotateとCount関数を使用するとかなり簡単になります。ここで、djangoのdistinct()は役に立ちません。私は、これらの2つのもの(注釈と別名)を統合することは可能ではないと考えています。あなたは私が推測する2つのクエリを書く必要があります。 – jurgenreza