web-dev-qa-db-ja.com

DjangoでAND集計によってグループ化する方法

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を経由することをお勧めします。

ありがとう

70
Guy Bowden

これを試して:

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

これを試してもらえますか。

Rating.objects.values('location_id').filter(attribute__in=attributes).annotate(sum_score=Sum('score')).