내일배움캠프/내일배움캠프 TIL

내일배움캠프 TIL 69일차 - 예외처리 해결

sogummi 2023. 6. 16. 01:56

Today I Learned 

주문 수량이 상품 재고 보다 많을 시 예외 처리 하는데 

ValidationError로 예외 처리 문구는 잘 떴는데 실제로는 
order_info가 빈 채로 db 저장이 되고 있었다

변경 전

 def create(self, validated_data):
        order_quantity = validated_data.get('order_quantity')
        product_key = validated_data.get('product')

        order = super().create(validated_data)

        product = ShopProduct.objects.get(id=product_key.id)

        if product.product_stock >= order_quantity:
            product.product_stock -= order_quantity
            product.save()

            order_info_list = []
            order_info = ShopOrderDetail(
                order=order,
                product=product,
                product_count=order_quantity,
                order_detail_status=0
            )
            order_info_list.append(order_info)
            ShopOrderDetail.objects.bulk_create(order_info_list)

            return order
        else:
            raise ValidationError("상품 재고가 주문 수량보다 적습니다.")

 

변경 후 

   def create(self, validated_data):
        order_quantity = validated_data.get('order_quantity')
        product_key = validated_data.get('product')

        product = ShopProduct.objects.get(id=product_key.id)

        if product.product_stock >= order_quantity:
            product.product_stock -= order_quantity
            product.save()

            order_info_list = []
            order = ShopOrder.objects.create(**validated_data)
            order_info = ShopOrderDetail(
                order=order,
                product=product,
                product_count=order_quantity,
                order_detail_status=0
            )
            order_info_list.append(order_info)
            ShopOrderDetail.objects.bulk_create(order_info_list)

            return order
        else:
            raise ValidationError("상품 재고가 주문 수량보다 적습니다.")

 

해결 :

super().create(validated_data)를 호출하는 위치의 문제였다! 
1. 변경 전 : order 객체를 먼저 생성한 후 해당 객체를 활용하여 상품 재고와 주문 수량을 비교하고 처리하는 로직
 => order_info가 빈 채로 DB에 저장되는 문제 
2. order객체 생성 전 상품 재고와 주문 수량을 비교하고 처리