@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가 이미 존재하는 항목이면 수량만 증가합니다.
@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
)를 보내줍니다.List Comprehension
는 입력 Sequence로부터 지정된 표현식에 따라 새로운 리스트 컬렉션을 빌드하는 것으로, 아래와 같은 문법을 갖습니다.[출력표현식 for 요소 in 입력Sequence [if 조건식]]
@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)
@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)