장바구니 및 주문 구현 수정 - 1

강사님께 질문을 하면서 내가 구현한 장바구니 부분보다 더 간단한 방법을 제안해주셨다.

일단 signal 함수라는 것은 유지보수 자체가 힘들다는 것을 알았다.

그래서 리뷰 평점을 계산하는 것도 모델 단에서 save를 재정의하는 방법을 검색해서 재구현했다.

1
2
3
4
5
6
def save(self, *args, **kwargs):
super(Review, self).save(*args, **kwargs)
product = self.product
product.review_count = product.reviews.count()
product.star_avg = product.reviews.aggregate(Avg('star_score'))['star_score__avg']
product.save()

그리고 장바구니는 모델과의 관계를 통해서 구현 방법을 생각해볼 수 있었다.

User 자체를 Cart로 생각하고 장바구니에 담을 상품을 저장할 모델인 OrderItem에 참조하게 한다.

주문 내역 모델인 Order도 OrderItem에 참조하게 한다.

그래서 다음과 같이 동작하게 하는 것이다.

  • 상품을 담을 때에는 User 모델을 연결하고 Order의 모델은 끊는다.

  • 주문이 완료되면 User 모델을 끊고 Order 모델은 연결한다.

이렇게 하면 OrderItem의 Query에서 해당 유저를 불러오면 장바구니에 담긴 목록을 알 수 있다.

그리고 Order의 Query를 통해서는 주문 내역도 볼 수 있다.

로직을 알았으니… 구현해본다!

Share