๐ ์ด ํฌ์คํ ์์๋ Django ORM์ Aggregate ๋งค์๋์ ๋ํด ์ ๋ฆฌํ์์ต๋๋ค.
โ๏ธ ์ฅ๊ณ ORM์ ์ด์ฉํด ๊ฐ์ฒด๋ฅผ CRUD(์์ฑ,์กฐํ,์์ ,์ญ์ )ํ ์ ์์ง๋ง, ๋๋ก๋ ํญ๋ชฉ๋ค์ ์ง๊ณ๊ฐ์ ๊ตฌํด์ผํ ๋๊ฐ ์๋ค.
โ๏ธ aggregate๋ Max, Min, Avg, Sum ๋ฑ์ ํจ์๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ๊ธฐ๋ก๋ ํญ๋ชฉ์ ์ง๊ณ๋ฅผ ๊ตฌํ ์ ์๋๋ก ๋์์ค๋ค.
โ๏ธ annote์ ์ฌ์ ์ ์๋ฏธ๋ '์ฃผ์์ ๋ฌ๋ค'๋ ์๋ฏธ์ด์ง๋ง, django orm์์๋ field(column)๋ฅผ ์ถ๊ฐํ๋ค ์ ๋๋ก ์ดํดํ๋ฉด ๋๋ค. ํญ๋ชฉ์ ์ง๊ณ๋ฅผ ๊ตฌํด ์ค์ ์กด์ฌํ์ง ์๋ ๊ฐ์์ field์ ๊ธฐ๋กํด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
โ๏ธ aggregate๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ django.db.models์์ ์ง๊ณ๋ฅผ ์ํ ํจ์๋ฅผ importํด์ผ ํ๋ค.
Django Shell >>> from django.db.models import Avg, Max, Min, Sum, Count
โ๏ธ Avg๋ฅผ ํ๊ท , Max๋ ์ต๋๊ฐ, Min์ ์ต์๊ฐ, Sum์ ํฉ๊ณ, Count๋ ๊ฐฏ์๋ฅผ ๊ตฌํด์ค๋ค.
Django Shell >>> User.objects.all().aggregate(Avg('age')) # {'age__avg': 28.391938481} Django Shell >>> User.objects.all().aggregate(Max('age')) # {'age__avg': 42} Django Shell >>> User.objects.all().aggregate(Min('age')) # {'age__avg': 26} Django Shell >>> User.objects.all().aggregate(Sum('age')) # {'age__avg': 872} Django Shell >>> User.objects.all().aggregate(Count('id')) # {'id__Count': 32}
โ๏ธ aggregate๋ฅผ ์ฌ์ฉํ๋ฉด "ํ๋๋ช _์ง๊ณ๋ฐฉ์"์ ํตํด ์๋์ผ๋ก ํ๋๊ฐ์ ์์ฑํด์ค๋ค.
โ๏ธ ์ด๋ฅผ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด, ์ํ๋ alias๋ก ๋ฐ์์ฃผ๋ฉด ๋๋ค. ์๋๋ ์ ์ฒด ํ๊ท ํ์ ์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด๋ค. ratingํ๋๋ฅผ ์ฌ์ฉํด ์ญ์ฐธ์กฐํ์ฌ ๋ชจ๋ ํ์ ์ ๊ฐ์ ธ์ ํ๊ท ์ ๊ตฌํด์ค๋ค.
Django Shell >>> q = Movie.objects.all().annotate(average_point=Avg("rating__rate")) Django Shell >>> q # {'average__point': Decimal('3.61429')}
โ๏ธ 1๋ฒ ์ํ์ ์ฃผ์ด์ง ํ์ ๋ค์ ๊ฐ์ ธ์ ํ๊ท ์ ๊ตฌํ๋ ๋ฐฉ์์ ์๋์ ๊ฐ๋ค.
Django Shell >>> q = Movie.objects.get(id=1).annotate(average_point=Avg("rating__rate")) Django Shell >>> q # {'average__point': Decimal('5.19231')}