[解決済み] DjangoでSELECT COUNT(*) GROUP BYとORDER BYを行うにはどうすればよいですか?
質問
トランザクションモデルを使用して、システムで発生するすべてのイベントを記録しています。
class Transaction(models.Model):
actor = models.ForeignKey(User, related_name="actor")
acted = models.ForeignKey(User, related_name="acted", null=True, blank=True)
action_id = models.IntegerField()
......
上位5人の俳優を自分のシステムに取り込むにはどうすればよいですか?
SQLでは、基本的に次のようになります。
SELECT actor, COUNT(*) as total
FROM Transaction
GROUP BY actor
ORDER BY total DESC
どのように解決するのですか?
ドキュメントによると、使用する必要があります。
from django.db.models import Count
Transaction.objects.all().values('actor').annotate(total=Count('actor')).order_by('total')
values() : "group by "に使用する列を指定します。
Django のドキュメントです。
values() 節が結果セットで返される列を制限するために使用されている場合、アノテーションの評価方法は以下のようになります。 を使用する場合、アノテーションを評価する方法は若干異なります。 は少し異なります。元の QuerySet の各結果に対してアノテーションされた結果を返すのではなく、元の QuerySet の結果に対してアノテーションされた結果を返します。 元のQuerySetの各結果に対してアノテーションされた結果を返すのではなく、元の結果は、フィールドのユニークな組み合わせに従ってグループ化されます。 で指定されたフィールドのユニークな組み合わせに従ってグループ化されます。 values() 節で指定されたフィールドのユニークな組み合わせに従ってグループ化されます。
annotate() : グループ化された値に対する操作を指定します。
Django のドキュメントです。
サマリー値を生成する 2 つ目の方法は、QuerySet 内の各オブジェクトに対して独立したサマリーを生成することです。例えば、もし を取得する場合、各書籍に貢献した著者の人数を知りたいと思うかもしれません。 を知りたい場合があります。各書籍は、著者と多対多のリレーションシップを持っています。 との多対多のリレーションシップがあります。 についてこの関係を要約したいと思います。
オブジェクトごとのサマリーは、annotate()節を使用して生成することができます。 annotate() 節が指定されると、QuerySet 内の各オブジェクトに指定された注釈が付きます。 の各オブジェクトは、指定された値で注釈されます。
order by節は自明です。
要約すると、著者のクエリセットを生成し、アノテーションを追加し(これは返された値に追加のフィールドを追加します)、最後に、この値でそれらを並べ替えます。
参照先 https://docs.djangoproject.com/en/dev/topics/db/aggregation/ を参照してください。
注意すべき点: Count を使用する場合、Count に渡された値は集約に影響せず、最終的な値に付けられる名前に影響するだけです。集計器は、Count に渡された値ではなく、(上記のように)値のユニークな組み合わせによってグループ化します。次のクエリも同じです。
Transaction.objects.all().values('actor').annotate(total=Count('actor')).order_by('total')
Transaction.objects.all().values('actor').annotate(total=Count('id')).order_by('total')
関連
-
[解決済み】Djangoのクエリセットフィルタリングでnot equalを行うにはどうすればよいですか?
-
Django ForeignKey逆引きクエリにおけるfilterと_setの効率比較
-
[解決済み] Django のビューで 2 つ以上のクエリセットを結合するにはどうすればよいですか?
-
[解決済み] Djangoのバージョンを確認する方法
-
[解決済み] Django のクエリで OR フィルタを行うにはどうすればよいですか?
-
[解決済み] Django のクエリを値のリストでフィルタリングするにはどうすればよいですか?
-
[解決済み】Djangoでnull=Trueとblank=Trueの違いは何ですか?
-
[解決済み]どのようにdjangoでGROUP BYとしてクエリを実行するには?
-
[解決済み] [Solved] カスタムDjango manage.pyコマンドをテストドライバから直接呼び出すにはどうしたらいいですか?
-
[解決済み] Django ORM のクエリセットに対応する SQL クエリを表示するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
6.5、Django - モデルでJSONFieldを使用してJSONフィールドでMySQLテーブルを作成する
-
ImproperlyConfiguredです。INSTALLED_APPS の設定を要求されたが、設定されていない
-
[解決済み] pipと要件ファイルを使って、特定のパッケージをアップグレードするにはどうすればよいですか?
-
[解決済み] Django の管理者パスワードをリセットする方法は?
-
[解決済み] Django テンプレート内で現在の URL を取得する方法は?
-
[解決済み] Django REST Framework: ModelSerializerに追加フィールドを追加する
-
[解決済み] DjangoとReactJSを連携させる方法とは?
-
[解決済み] Django Forms: 有効でない場合、エラーメッセージとともにフォームを表示する
-
[解決済み] RESTful API のトークン認証:トークンは定期的に変更する必要がありますか?
-
[解決済み] Django はフォームが初期化された後にフィールドの値を設定します。