Django で GROUP BY としてクエリを実行するにはどうすればいいですか? 質問する

Django で GROUP BY としてクエリを実行するにはどうすればいいですか? 質問する

モデルをクエリします:

Members.objects.all()

そして、次のように返されます:

Eric, Salesman, X-Shop
Freddie, Manager, X2-Shop
Teddy, Salesman, X2-Shop
Sean, Manager, X2-Shop

私が知りたいのは、group_by次のようなデータベースにクエリを実行するための最適な Django の方法です。

Members.objects.all().group_by('designation')

もちろん、これは機能しません。 でいくつかのトリックを実行できることは知っていますdjango/db/models/query.pyが、パッチを適用せずにそれを実行する方法を知りたいだけです。

ベストアンサー1

集計を行う場合は、ORMの集約機能:

from django.db.models import Count
result = (Members.objects
    .values('designation')
    .annotate(dcount=Count('designation'))
    .order_by()
)

これは次のようなクエリになります

SELECT designation, COUNT(designation) AS dcount
FROM members GROUP BY designation

出力は次のようになります

[{'designation': 'Salesman', 'dcount': 2}, 
 {'designation': 'Manager', 'dcount': 2}]

を含めない場合order_by()、デフォルトの並べ替えが期待どおりでない場合、誤った結果が返される可能性があります。

結果に複数のフィールドを含める場合は、values次のように引数として追加するだけです。

    .values('designation', 'first_name', 'last_name')

参考文献:

おすすめ記事