1. ホーム
  2. パイソン

[解決済み]どのようにdjangoでGROUP BYとしてクエリを実行するには?

2022-03-24 02:57:22

質問

あるモデルにクエリを発行します。

Members.objects.all()

と返ってきます。

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

私が欲しいのは、Djangoの最良の方法である a group_by のような、データベースへのクエリ。

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

もちろん、うまくいきません。 のトリックができるのは知っています。 django/db/models/query.py しかし、パッチを当てずにそれを行う方法を知りたいと思っています。

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

もし、集計を行うのであれば 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')

参考文献