장바구니 API

SungjoonAn·2022년 3월 13일
0

Django

목록 보기
12/12
post-thumbnail

웹사이트에서 Django로 장바구니(Cart) 기능 구현하기

장바구니 담기(POST) 기능

 @login_required
    def post(self, request):
        try:
            data = json.loads(request.body)
            
            user     = request.user
            quantity = data['quantity']
            drink_id = data['drink_id']

            if not Drink.objects.filter(id = drink_id).exists():
                return JsonResponse({'message' : 'DRINK_NOT_EXIST'}, status = 400)

            cart, created = Cart.objects.get_or_create(
                user     = user,
                drink_id = drink_id,
                quantity = quantity
            )

            cart.save()

            return JsonResponse({'message' : 'CART_CREATED'}, status = 201)

        except json.JSONDecodeError:
            return JsonResponse({'message' : 'JSON_DECODE_ERROR'}, status = 400)  

        except Cart.DoesNotExist:
            return JsonResponse({'message' : 'CART_NOT_FOUND'}, status = 400)  
        
        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status = 400)
  • 유저, 상품, 수량을 받아서 carts 테이블에 저장합니다.

  • get_or_create(): cart가 존재할 경우 cart를 얻고 cart가 존재하지 않으면 새로 생성합니다. 반환은 (cart, created)로 튜플 형식으로 반환한다. 여기서 created는 boolean flag입니다. instance가 get_or_create에 의해 생성이 되었으면 True를 반환하고, instance를 기존 데이터베이스에서 꺼내왔으면 False를 반환한다. 그렇기 때문에 cart가 이미 존재하는 항목이면 수량만 증가합니다.


장바구니 조회(GET) 기능

@login_required
    def get(self, request):

        carts  = Cart.objects.select_related('drink').filter(user = request.user)

        result = [
            {
            'cart_id'    : cart.id,
            'drink_name' : cart.drink.name,
            'quantity'   : cart.quantity,
            'price'      : cart.drink.price
            }
            for cart in carts]

        return JsonResponse({'result' : result}, status = 200)
  • 저장된 장바구니 항목 리스트(cart_id, drink_name, quantity, price)를 보내줍니다.
  • 유저는 여러개의 cart를 가질 수 있습니다.
  • List Comprehension는 입력 Sequence로부터 지정된 표현식에 따라 새로운 리스트 컬렉션을 빌드하는 것으로, 아래와 같은 문법을 갖습니다.

    [출력표현식 for 요소 in 입력Sequence [if 조건식]]


장바구니 조회(PATCH) 기능

 @login_required
    def patch(self, request):
        try:
            data = json.loads(request.body)

            cart = Cart.objects.get(id = data['cart_id'])
            cart.quantity = data['quantity']
            
            cart.save()
            
            return JsonResponse({'message' : 'ITEM_QUANTITY_CHANGED', 'quantity' : cart.quantity}, status = 200)

        except Cart.DoesNotExist:
            return JsonResponse({'message' : 'CART_NOT_FOUND'}, status = 400)  

        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status = 400)
  • 지정한 cart의 product의 수량을 수정하면 DB에 업데이트하고 업데이트된 수량을 보내줍니다.
  • query parameter 로 cart_id를 받고, body로 quantity를 받습니다.

장바구니 삭제(DELETE) 기능

@login_required
    def delete(self, request, cart_id):
        try:
            data = json.loads(request.body)

            user = request.user

            if not Cart.objects.filter(user = user, id = cart_id).exists():
                return JsonResponse({'message' : 'CART_DOES_NOT_EXIST'}, status = 400)

            Cart.objects.filter(user = user, id = cart_id).delete()

            return JsonResponse({'message' : 'CART_DELETED'}, status = 204)

        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status = 400)
  • cart_id를 query parameter로 받아서 해당 선택된 cart의 항목을 삭제합니다.

0개의 댓글