Django ORM에서 GROUP BY
를 하려면 annotate
와 values
를 사용한다.
여기서 values('keyword')
는 GROUP BY
로 묶을 컬럼을 지정해주고
annotate
는 위에서 묶은 집단에서의 집계함수를 새로 생성하는 개념이라고 생각할 수 있다.
queryset = Record.objects.all().values('character')
Record라는 모델에서 character
컬럼의 값이 같은것끼리 묶는다.
쿼리셋을 출력해보면 다음과 같다.
여기서 출력되는 것은 전체 쿼리셋이다.
그 뒤에 annotate
를 붙여보자
queryset = Record.objects.all().values('character').annotate(count=Count('*'))
3개였던 쿼리셋이 character
의 값이 같은 2개가 묶여 2개로 출력된다.
그러고 count
라는 값이 새로 생성된 것을 볼 수 있다.
annotate(count=Count('*'))
의 뜻은 count라는 컬럼을 새로 만들고 그 값으로 Count('*')
를 담겠다는 뜻이다.
여기에 새로 annotate
를 추가해보자.
Record.objects.all().values('character').annotate(count=Count('*')).annotate(avgdmg=Avg('damageToPlayer'))
뒤에 새로운 annotate
를 달아줬더니 쿼리에도 새로운 컬럼이 생성되었다.
이 두개를 한번에 사용해도 결과는 똑같이 나온다.
Record.objects.all().values('character').annotate(count=Count('*'),avgdmg=Avg('damageToPlayer'))