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


82

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을 사용하는 것이 좋습니다.

감사



답변:


135

이 시도:

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

3
hmmm-집계가 아닌 주석 달기-그 이유는 무엇입니까?
Guy Bowden 2012

51
aggregateannotate개별 (그룹화 된) 행에 대한 전체 결과 집합을 위한 것입니다.
Bouke 2013-01-16

누구든지 'dict' object has no attribute '_meta'그러한 QuerySet 으로 해결하는 방법을 알고 있습니까?
maciek

안녕하세요 @Aamir, 비슷한 문제가 있습니다. 살펴볼 수 있습니까? 링크 - 여기
Ermir Beqiraj에게

반환 뭔가 같은[{"location": 53, "score": 100}, {"location": 54, "score": 104}]
Irvan

38

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

Rating.objects.values('location_id').filter(attribute__in=attributes).annotate(sum_score=Sum('score')).
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.