Django Signals

상품 리뷰에 대한 평점을 데이터베이스에 저장해야 했다.

그런데 평점이기 때문에 리뷰의 개수와 점수에 따라 평점이 달라져야 했다.

그래서 방법을 생각하다가 Django에서 Signals가 떠올랐다.

어떤 특정한 일을 수행할 때마다 지정한 동작이 수행될 수 있도록 할 수 있다.

리뷰 관련 DB Model에서 저장이 완료되면 리뷰의 평점을 계산해서 필드에 저장하는 방법으로 구현하였다.

1
2
3
4
5
6
7
8
9
10
11
12
# review 작성 시 상품의 전체 리뷰 수와 평점이 계산됨
@receiver(post_save, sender=Review)
def calculate_review(sender, **kwargs):
# 해당 리뷰의 상품 정보를 받아옴
pd = kwargs['instance'].product
# 상품의 리뷰 개수 저장
pd.review_count = pd.reviews.count()
# 상품의 리뷰 평점을 계산해서 저장
# 해당 쿼리를 계산하기 위해 aggregate 사용
# star_score__avg의 value 값을 바로 저장
pd.star_avg = pd.reviews.aggregate(Avg('star_score'))['star_score__avg']
pd.save()
Share