이번 post에서는 project를 진행하면서 알게된 method() 중 하나인 annotate method에 대해서 정리해보려 한다.
project를 진행하며 Product라는 class table 내에 Review content인 rating의 average가 필요했다. 그래서 annotate()를 사용함으로써 Product model 내에 가상 변수를 사용하여 review와 relation 시키고자 하였다.
products = Product.objects.filter(q)\ .annotate(reviews_count=Count('review'))\ .annotate(average_rating=Avg('review__rating'))\ .values("id", "name", "author", "thumbnail_image_url", "date_published", "average_rating", "head_description", "detail_description1", "detail_description2")\ .distinct()
result = [{ "id" : product['id'], "name" : product['name'], "author" : product['author'], "image" : product['thumbnail_image_url'], "date_published" : product['date_published'], "head_description" : product['head_description'], "detail_description1" : product['detail_description1'], "detail_description2" : product['detail_description2'], "rating" : round(float(product['average_rating']), 1) if product['average_rating'] else 0 } for product in products]
from django.db.models import Q, Avg, Count
를 views.py 파일 위에 선언을 해줘야 한다.
위와 같이 annotate()를 사용하면 선언한 변수를 products를 사용하여 'average_rating'으로 불러 올 수 있다.
Product와 review의 rating을 연결 시키는데 있어서 처음에는 어떻게 접근해야 할지 막막했었다. annotate를 사용함으로써 Product와 Review를 link 시켜 필요한 data를 적용할 수 있었다. 이런 하나하나 method들을 익혀야지!!