장바구니 및 주문

스토어를 중심으로 구현하고 있었기 때문에 장바구니는 핵심 기능 중 하나였다.

장바구니에 대해서 내가 정리한 건 다음과 같았다.

  • 유저마다 장바구니가 존재
  • 장바구니에 담긴 상품을 구매하게 되면 장바구니에 있는 목록은 삭제
  • 장바구니를 통한 구매와 바로 구매하는 두 가지 주문 방법이 있음

일단 유저가 담은 상품들을 저장하는 모델을 만들었다.

1
2
3
class ProductOrderCart(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='cart')
product_option = models.ForeignKey(ProductOption, on_delete=models.CASCADE, related_name='cart')

상품을 구입할 때는 상품의 옵션에 따라서 가격이 달라지기 때문에 상품 옵션과 연결지었다.

상품의 옵션 모델과 상품 모델도 연결되어 있기 때문에 상품 옵션의 고유 ID를 알 수 있다면

상품도 알 수 있기 때문이다.

그리고 가장 중요하게 생각한 것이 상품을 주문한 후에는 장바구니에서 구매한 목록들은 사라져야 했다.

그래서 결제하는 유저의 정보를 저장하는 모델과 주문이 완료된 상품을 저장할 모델을 만들었다.

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
class Payment(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='order')
# 받는분, Recipient
recipient = models.CharField(max_length=50)
# 주문자_휴대전화, Orderer_cell phone,
orderer_phone_number = models.CharField(max_length=30)
# 상품 금액
product_price = models.PositiveIntegerField(default=0)
# 배송비
deliver_price = models.PositiveIntegerField(default=0)
# 총 결제금액, Total payment amount,
total_price = models.PositiveIntegerField(default=0)
# 생성날짜 및 시간
created = models.DateTimeField(auto_now_add=True)


class OrderProduct(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='order_product')
product_option = models.ForeignKey(ProductOption, on_delete=models.CASCADE, related_name='order_product')
payment = models.ForeignKey(Payment, on_delete=models.CASCADE, related_name='order_product')
# 생성날짜 및 시간
created = models.DateTimeField(auto_now_add=True)

def __str__(self):
return str(self.id)

class Meta:
ordering = ['id']

그리고 signal 함수를 이용하여 주문이 완료되면 주문 완료 모델을 생성하여 상품을 저장하였고

장바구니 목록에 있는 상품은 삭제하도록 구현하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@receiver(post_save, sender=Payment)
def after_payment(sender, **kwargs):
cart_delete_list = []
pm = kwargs['instance'].id
user = kwargs['instance'].user
pd_in_cart_num = user.cart.count()
for pd in range(0, pd_in_cart_num):
print(user.cart.all()[pd].product_option.id)
OrderProduct(user_id=user.id, product_option_id=user.cart.all()[pd].product_option.id, payment_id=pm).save()
cart_item = ProductOrderCart.objects.all().get(Q(user_id=user.id) & Q(id=user.cart.all()[pd].id))
cart_delete_list.append(cart_item.id)

for idx in cart_delete_list:
cart_delete_item = ProductOrderCart.objects.get(pk=idx)
cart_delete_item.delete()

장바구니의 모습(?)처럼 동작은 하지만 바로 구매하는 것이 문제였다.

바로 구매하는 것을 위해서 모델을 하나 더 생성한다면 주문 번호를 하나로 할 수가 없었다.

조금 더 생각해봐야 겠다.

Share