87

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を使用したいと思います。

ありがとう

4

2 に答える 2

143

これを試して:

Rating.objects.filter(attribute__in=attributes) \
    .values('location') \
    .annotate(score = Sum('score')) \
    .order_by('-score')
于 2012-11-15T19:29:58.713 に答える
39

これを試していただけますか。

Rating.objects.values('location_id').filter(attribute__in=attributes).annotate(sum_score=Sum('score')).order_by('-score')
于 2012-11-15T18:27:23.063 に答える