serializer.save()

장바구니에 상품들이 담기면 총 상품에 대한 가격이 계산되어야 했다.

상품을 실제로 파는 것은 아니었으므로 회의를 통해 배송 가격은 무료로 정했다.

따라서 상품의 가격의 가격들만 더하면 총 가격이 되었다.

그래서 REST Framework의 generic view에 있는 serializers.save()를 사용하기로 했다.

기존에 이미 해당 유저의 정보를 저장할 때 사용 중이었다.

1
2
def perform_create(self, serializer):
serializer.save(user=self.request.user)

그래서 해당 view에서 다음과 같이 구현했다.

1
2
3
4
5
6
7
8
def perform_create(self, serializer):
user = self.request.user
# 장바구니에 담긴 총 상품 가격 얻기
total_price = user.cart.aggregate(Sum('product_option_id__price'))['product_option_id__price__sum']
serializer.save(user=user)
serializer.save(product_price=total_price)
serializer.save(deliver_price=0)
serializer.save(total_price=total_price)

그리고 Postman으로 장바구니 관련 테스트를 진행하는데 자꾸 상품 모델이 4개가 저장이 되는 문제가 발생했다.

뭐가 문제일까 생각하다가 위 부분이 떠올랐다. 그렇다. 저렇게 하면 4번이 저장되는 것이었다.

그래서 아래와 같이 고쳐서 해결했다.

1
2
3
4
5
def perform_create(self, serializer):
user = self.request.user
# 장바구니에 담긴 총 상품 가격 얻기
total_price = user.cart.aggregate(Sum('product_option_id__price'))['product_option_id__price__sum']
serializer.save(user=user, product_price=total_price, deliver_price=0, total_price=total_price)

generic view가 구현할 때 편한 만큼 조금 더 문서를 찾아봐야 겠다.

Share