1. ホーム
  2. django

[解決済み] Django で group by AND aggregate する方法

2023-05-10 14:06:51

質問

ORM を通してかなり簡単なクエリを作成したいのですが、それがわかりません。

私は3つのモデルを持っています。

ロケーション(場所)、アトリビュート(場所が持つ可能性のある属性)、レイティング(スコアフィールドも含むM2Mの「スルー」モデル)です。

私はいくつかの重要な属性を選び、それらの属性によって場所をランク付けできるようにしたいと思います。

次のSQLを使用して、私が望むものを得ることができます。

select location_id, sum(score) 
    from locations_rating 
    where attribute_id in (1,2,3) 
    group by location_id order by sum desc;

を返します。

 location_id | sum 
-------------+-----
          21 |  12
           3 |  11

ORMで一番近いのは

Rating.objects.filter(
    attribute__in=attributes).annotate(
    acount=Count('location')).aggregate(Sum('score'))

を返す

{'score__sum': 23}

すなわち、場所によってグループ化されていない、すべての合計です。

これを回避する方法はありますか?SQLを手動で実行することもできますが、一貫性を保つためにORMを経由する方がよいでしょう。

ありがとうございます。

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

これを試してみてください。

Rating.objects.filter(attribute__in=attributes) \
    .values('location') \
    .annotate(score = Sum('score')) \
    .order_by('-score')