annotate๋ ์ฅ๊ณ ์ ์ฟผ๋ฆฌํํ์ ์ค ํ๋์ด๋ค.
๋๊ฐ์ง์ ๋ชจ๋ธ์ด ์๊ณ , foreign key๋ก ์ฐ๊ฒฐ๋๋ค๊ณ ๊ฐ์ ํด๋ณด์
class Product(models.Model):
name = models.CharField('์ด๋ฆ', max_length=150)
price = models.IntegerField('๊ฐ๊ฒฉ')
========================================================
class OrderLog(models.Model):
product = models.ForeignKey('Product')
created = models.DateTimeField() #ํ๋งค์ผ
๐ ์ฟผ๋ฆฌ์ ์์ ๋ถ๋ฌ์ฌ ๋
order_log = OrderLog.objects.values('created',
'product__name','product__price')
# ๋ค๋ฅธ ํด๋์ค์ ์๋ ์นผ๋ผ์ ๋ถ๋ฌ์ค๋ ค๋ฉด ์์ ์
๋ ฅํ ๊ฒ์ฒ๋ผ
# 'ํด๋์ค๋ช
์๋ฌธ์__๋ถ๋ฌ์ค๋ ค๋ ์นผ๋ผ๋ช
' ์ ์
๋ ฅํด์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ผ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ
{'product__price': 9900, 'created': datetime.datetime(2016, 4, 1, 0, 0), 'product__name': 'ABC Activity'} {'product__price': 8200, 'created': datetime.datetime(2016, 4, 1, 0, 0), 'product__name': '๋๋ฌผ๋์'}
์ด๋ฐ์์ผ๋ก ์ธ๋๋ฐ๊ฐ ๊ทธ๋๋ก ๋์จ๋ค.
annotate
๋ฅผ ์จ์ ๋ฐ๊ฟ๋ณด์
order_log = OrderLog.objects.annotate(
name =F('product__name'),
price=F('product__price')
.values('created','name','price')
๊ทธ๋ผ ๊ฒฐ๊ณผ๊ฐ ์ด๋ ๊ฒ ๋์จ๋ค!!!
{'price': 9900, 'created': datetime.datetime(2016, 4, 1, 0, 0), 'name': 'ABC Activity'} {'price': 8200, 'created': datetime.datetime(2016, 4, 1, 0, 0), 'name': '๋๋ฌผ๋์'}
ex. ๋ ์ง๋ณ(created)๋ก ๊ฐ์ ๋ฌถ๊ณ ์ถ์ ๋
daily_list = order_log.values(
'created'
).annotate(daily_total=Sum('product__price'))
์ฅ๊ณ ์ models.py์์ ํด๋์ค์ ์นผ๋ผ์ ๋ฐ์ดํฐ๊ฐ ๋ช๊ฐ ์๋์ง ํ์ธ ํ ๋
์๋ฅผ ๋ค์ด, ๋๋ models.py
์
class Category(models.Model):
name = models.CharField(max_length = 45)
main_category = models.ForeignKey(MainCategory, on_delete=models.CASCADE)
์ฒ๋ผ ๋ก์ง์ ์งฐ๊ณ , category๋ผ๋ ํด๋์ค์ name์นผ๋ผ์ ๋ฐ์ดํฐ๊ฐ ๋ช๊ฐ ์ธ์ง ํ์ธํ๊ณ ์ ํ๋ค๋ฉด
n = Category.objects.annotate(Count('name'))
> ๊ฒฐ๊ณผ : <QuerySet [<Category: Category object (1)>, <Category: Category object (2)>, <Category: Category object (3)>, <Category: Category object (4)>, <Category: Category object (5)>, <Category: Category object (6)>, <Category: Category object (7)>]>
#row์ ๋ฐ์ดํฐ๋ช
์ถ๋ ฅ
n[0].name
> NEW ARRIVAL
์ด๋ ๊ฒ ๋ฌ๋ค. ์ค์ ๋ด ๋ฐ์ดํฐ์ 7๊ฐ์ row๊ฐ ์กด์ฌํ๋ค.
Django ์์๋ ํ๋ ์ ์ฒด์ ํฉ, ํ๊ท , ๊ฐ์ ๋ฑ์ ๊ณ์ฐํ ๋ ์ฌ์ฉํ๋ค
from django.db.models import F, Sum, Count, Case, When
order_log.aggregate(totle_price=Sum('price'))
{'total_price': 262200}
์ถ์ฒ : ์ฐธ๊ณ ์ฌ์ดํธ