TIL 18. Django method_annotate()

Drageon Lee·2021년 11월 14일
0

TIL_Django

목록 보기
4/8

Today's topic

👉 annotate() method 사용방법

이번 post에서는 project를 진행하면서 알게된 method() 중 하나인 annotate method에 대해서 정리해보려 한다.

👉 annotate()를 사용하는 경우

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'으로 불러 올 수 있다.

My opinion

Product와 review의 rating을 연결 시키는데 있어서 처음에는 어떻게 접근해야 할지 막막했었다. annotate를 사용함으로써 Product와 Review를 link 시켜 필요한 data를 적용할 수 있었다. 이런 하나하나 method들을 익혀야지!!

profile
운동하는 개발자

0개의 댓글