annotate(), aggregate()
annotate()
- 각 인수는 QuerySet의 각 객체에 추가 될 주석이다.
- 주석들은 단순한 값, 모델의 필드에 대한 참조, QuerySet의 각 객체와 관련된 집계이다.
- 새로운 요소를 데이터 쿼리에 추가하고 해당 요소를 따로 출력해볼 수 있도록 해주는 것인데, 데이터가 몇 개 존재하는지를
.count()
라는 함수를 이용해서 annotate
해주고 이를 __count
로 접근할 수 있다.
- 따라서
.annotate()
는 필드 하나를 만들고 거기에 '어떤 내용'을 채우게 만드는 것이다.
aggregate()
- QuerySet에 대해 계산된 집계를 dict형태로 반환한다.
- 집계도 쿼리식이기 때문에 다른 집계나 값과 결합하여 복잡한 집계를 만들 수 있다.
- 키워드 인수를 사용해서 집계된 집계는 키를 주석의 이름으로 사용한다.
- 익명 인수는 집계함수의 이름과 집계되는 모델필드에 따라 이름이 생성된다.
- 복합집계는 익명 인수를 사용할 수 없으므로 별칭을 지정해줘야한다.
- 대부분의 상황에서 자동생성된 키는 접근하기 불편하므로 키워드 인자를 건네주는 습관을 들여야한다.
- 집계함수 : 테이블의 여러 행이나 전체 행으로부터 하나의 값을 집계하여 반환하는 함수이다.
COUNT, SUM, AVG, MAX, MIN
>>> from django.db.models import Sum, Count
>>> list_qs.aggregate(total_age=Sum('age'))
{'total_age': 14}
>>> q = Owner.objects.aggregate(number_of_entries=Count('age'))
>>> q
{'age__count': 3}
>>> q = Owner.objects.aggregate(number_of_entries=Count('age'))
>>> q
{'number_of_entries': 3}
annotate()와 aggregate()의 차이점
annotate는 쿼리셋의 각 객체들에 적용되고 aggregate는 전체 쿼리셋에 대한 값을 계산합니다.
>>> q = Owner.objects.annotate(num_age=Count('age'))
>>> q
<QuerySet [<Owner: Owner object (1)>, <Owner: Owner object (2)>, <Owner: Owner object (3)>]>
>>> q[0].name
'김가람휘'
>> Owner.objects.aggregate(num_age=Count('age'))
{'num_age': 3}
>>> Owner.objects.aggregate(average_age=Avg('age'))
{'average_age': 19.3333}