LANEIGE clone 프로젝트 과정(5)

JM·2020년 7월 19일
1

Project

목록 보기
9/11
post-custom-banner

order.models.py

from django.db import models

from account.models import Account
from product.models import Product,Image


class OrderProduct(models.Model):
    order       = models.ForeignKey("Order", on_delete = models.SET_NULL, null = True)
    product     = models.ForeignKey("product.Product", on_delete = models.SET_NULL, null = True)
    price       = models.DecimalField(max_digits = 10, decimal_places = 2)
    quantity    = models.IntegerField(null=True)

    class Meta:
        db_table = "order_products"

class Order(models.Model):
    account          = models.ForeignKey("account.Account", on_delete = models.SET_NULL, null = True)
    status           = models.ForeignKey("OrderStatus", on_delete = models.SET_NULL, null = True)
    order_date       = models.DateTimeField(auto_now_add = True, null= True)
    address          = models.TextField(null=True)
    product          = models.ManyToManyField("product.Product", through = "OrderProduct")
    total_price      = models.DecimalField(max_digits = 10, decimal_places = 2, null=True)
    
    class Meta:
        db_table = "orders"

class OrderStatus(models.Model):
    name  = models.CharField(max_length = 50)
    
    class Meta:
        db_table = "order_status"
  • 장바구니와 결제를 구현하고자 models.py를 만들었다.
  • 처음 생각한 부분은 order 테이블을 만들어 주문이 생길 경우 하나의 order 데이터를 만들어 구현을 하고자 하였다. 하지만 이런 방식은 데이터의 중복이 많이 생길뿐더러 효율적이지 못한 방법이였다.
  • 제품과 주문 사이의 중간 테이블을 만들어 관리를 하는 것이 하나의 방법이라는 설명을 듣고 구현해보았다.

order.views.py

import json
import bcrypt
import jwt
import requests
import hashlib
import hmac
import base64
import time

from laneige.settings        import (
    SECRET_KEY,
    ACCESS_KEY,
    NAVER_SECRET_KEY,
    NAVER_SMS_URI,
    NAVER_URI,
    ALGORITHM
)

from django.db import transaction
from django.views import View
from django.http  import (
    JsonResponse, 
    HttpResponse
)

from .models    import (
    Order, 
    OrderProduct, 
    OrderStatus
)

from product.models  import Product,Image
from account.models  import Account
from account.utils   import login_required

class CartAddView(View):
    @login_required
    def post(self,request):
        
        cart_data = json.loads(request.body)
        try :
            product = Product.objects.get(id = cart_data['product'])
          
            order = Order.objects.create(
                account = Account.objects.get(id=request.user_id.id),
                status  = OrderStatus.objects.get(name="장바구니")
                )
            
            OrderProduct.objects.create(
                product    = Product.objects.get(id=cart_data['product']),
                quantity   = cart_data['quantity'],
                price      = product.price,
                order      = order
                )
                
            return HttpResponse(status = 200)
            
        except KeyError:    
            return JsonResponse({ 'message' : 'INVALID_KEYS'}, status=400)

class CartListView(View):
    @login_required
    def get(self, request):
        try :
            products = OrderProduct.objects.select_related('order', 'product').filter(order__account=request.user_id,order__status=1)       
            product_list = [{
                'cart_num'          : product.id,
                'productNum'        : product.product.id,
                'productKoName'     : product.product.name_ko,
                'productEnName'     : product.product.name_en,
                'productImg'        : Image.objects.get(is_main_img=True, product=product.product.id).image_url,
                'productVolumn'     : product.product.volume,
                'productPrice'      : round(product.product.price),
                'productQuantity'   : product.quantity
            } for product in products]
            return JsonResponse({"product_list" : product_list}, status = 200)
        
        except OrderProduct.DoesNotExist:
            return JsonResponse({"error_code":"EMPTY_CART"}, status=401)
        
    @login_required
    def put(self, request):
        data = json.loads(request.body)   
        cart = OrderProduct.objects.get(order__account=request.user_id.id,id=data['cart_num'])  
        cart.quantity = data['quantity']
        cart.save()

        products = OrderProduct.objects.select_related('order', 'product').filter(order__account=request.user_id.id,order__status=1)
        product_list = [{
            'cart_num'          : product.id,
            'productNum'        : product.product.id,
            'productKoName'     : product.product.name_ko,
            'productEnName'     : product.product.name_en,
            'productImg'        : Image.objects.get(is_main_img=True, product=product.product.id).image_url,
            'productVolumn'     : product.product.volume,
            'productPrice'      : product.product.price,
            'productQuantity'   : product.quantity
        } for product in products]
        return JsonResponse({"product_list" : product_list}, status = 200)
        
    @login_required
    def delete(self, request):
        try :
            data = json.loads(request.body)
            cart = OrderProduct.objects.get(order__account=request.user_id,id=data['cart_num'])  
            cart.delete()

            products = OrderProduct.objects.select_related('order', 'product').filter(order__account=request.user_id,order__status=1)
            product_list = [{
                'cart_num'          : product.id,
                'productNum'        : product.product.id,
                'productKoName'     : product.product.name_ko,
                'productEnName'     : product.product.name_en,
                'productImg'        : Image.objects.get(is_main_img=True, product=product.product.id).image_url,
                'productVolumn'     : product.product.volume,
                'productPrice'      : product.product.price,
                'productQuantity'   : product.quantity
            } for product in products]
            
            return JsonResponse({"product_list" : product_list}, status = 200)
        
        except :
            return JsonResponse({"product_list" :"NOT_EXIST_CART_NUMBER"}, status = 200)   
        
  • 제품 페이지에서 장바구니에 추가를 하게 되면 post 방식으로 해당 제품의 품번을 받고 login_decorater를 통해 해당 유저의 id_number를 받게 된다. 받은 값들로 order 테이블을 생성하고 생성된 order 데이터를 foreignkey로 연결한 orderproduct 데이터를 생성한다.
  • 즉 하나의 제품을 장바구니에 담은 경우 order, orderproduct 두 개의 테이블에 데이터를 생성한다.
  • 장바구니 페이지에서는 select_related를 사용하여 저장된 정보중 해당 유저의 id_number, orderstatus가 1("장바구니") 상태인 정보들을 불러와 필요한 정보들을 list로 만들어 frontend로 return 한다.
  • 장바구니에 담긴 제품들에 대해 수량을 수정하는 경우 Put을 사용하여 해당 유저 id_number와 제품에 대한 order_number(cart_num)을 받고 수량에 대한 정보(quantity)를 받아 정보를 수정하고 다시 Get 형태로 list를 return 한다.
  • 삭제의 경우 수정과 비슷하나 Delete를 사용하여 해당 order_number(cart_num)을 삭제하고 다시 list를 return 한다.
  • 결제는 추후에 구현할 예정이다.
post-custom-banner

0개의 댓글