モデルをクエリします:
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')
参考文献:
- Django ドキュメント:
values()
、annotate()
、 そしてCount
- Django ドキュメント:集約、特に「デフォルトの順序付けとの相互作用または
order_by()