[django] Django로 AND 집계별로 그룹화하는 방법

ORM을 통해 만들고 싶은 아주 간단한 쿼리가 있지만 알아낼 수 없습니다 ..

세 가지 모델이 있습니다.

위치 (장소), 속성 (장소에있을 수있는 속성) 및 등급 (점수 필드도 포함하는 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')


답변

이것을 시도해 볼 수 있습니다.

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


답변