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

모델을 다시 만들었고 상품의 수량도 변경할 수 있도록 필드도 추가했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class OrderItem(models.Model):
# 아이템을 선택한 유저
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orderitems', null=True)
# 결제 완료 시, order model과의 연결을 위함
order = models.ForeignKey('Order', on_delete=models.CASCADE, related_name='orderitems', null=True)
# 선택한 상품
product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='orderitems')
# 선택한 상품 옵션
product_option = models.ForeignKey(ProductOption, on_delete=models.CASCADE, related_name='orderitems')
# 선택한 상품 옵션 수량
quantity = models.PositiveIntegerField(default=1)

def __str__(self):
return self.product.name + "(" + self.product_option.name + ")"

class Meta:
ordering = ['id']


class Order(models.Model):
# 결제한 유저
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='orders')
created = models.DateField(auto_now_add=True)

def __str__(self):
return self.user.username + "(" + self.user.type + ")"

class Meta:
ordering = ['id']

그리고 generic view가 아닌 APIView를 사용해서 구현을 시작했다.

장바구니에 담긴 상품들 중에서 골라서 주문할 수 있기 때문에 주문할 상품의 id를 리스트로 보내달라고 요청드렸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def post(self, request, *args, **kwargs):
serializer = OrderFromCartCreateSerializer(data=request.data)

if serializer.is_valid():
instance = serializer.save(user=request.user)
# pk_list를 받아서 split을 통해 숫자 리스트를 받음
pk_list = request.POST['pk_list'].replace('"', '').split(',')

for pk in pk_list:
# orderitem에서 해당 pk 값을 가진 orderitem을 얻음
orderitem = OrderItem.objects.get(pk=int(pk))
# instance.id를 통해 order의 id를 얻고, orderitem의 order에 넣음(order와 연결)
orderitem.order_id = instance.id
# None을 통해 user와의 관계를 끊음
orderitem.user = None
orderitem.save()

return Response(OrderSerializer(instance).data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

하지만 구매하는 방법은 한 개가 아니었다.

장바구니를 통한 구매도 있었지만, 바로 구매하는 방법도 있었다.

그래서 상품의 옵션과 수량을 직접 받아야 했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
def post(self, request, *args, **kwargs):
serializer = OrderDirectCreateSerializer(data=request.data)

if serializer.is_valid():
instance = serializer.save(user=request.user)
# pd_id : 상품의 고유 id
pd_id = request.POST['pd_id'].replace('"', '')
# po_list : 상품 옵션의 고유 id를 split을 통해 숫자 리스트로 받음
po_list = request.POST['po_list'].replace('"', '').split(',')
# qty_list : 상품 옵션 수량을 split을 통해 숫자 리스트로 받음
qty_list = request.POST['qty_list'].replace('"', '').split(',')

for idx in range(len(po_list)):
# 장바구니에 들어가는 것이 아니기 때문에 orderitem을 직접 생성
orderitem = OrderItem()
# 상품 id를 넣음
orderitem.product_id = int(pd_id)
# 상품 옵션 id를 넣음
orderitem.product_option_id = int(po_list[idx])
# instance에서 order의 id를 얻어서 넣음(order와 연결)
orderitem.order_id = instance.id
# 상품 수량을 넣음
orderitem.quantity = int(qty_list[idx])
# None을 통해 user와의 관계를 끊음
orderitem.user = None
orderitem.save()

return Response(OrderSerializer(instance).data)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Postman 요청 테스트가 잘 되어 Front 분들에게 요청을 부탁했다.

구현했던 것을 완전히 다른 방법으로 뒤엎으면서 걱정이 많이 된 이유 중에 하나는 시간이었다.

혼자서 진행하는 프로젝트가 아니었으므로, Front 분들도 데이터를 받아보면서 테스트하는 시간이

있었기 때문에 빨리 구현할 수 있을까하는 걱정도 있었다.

그래도 이전 로직이 마음에 많이 걸렸는데 더 나은 방법으로 구현할 수 있어서 다행이었던 것 같다!

Share