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')).