同样,用户更新购物车信息,需要判断商品是否存在,如果用户未登录,将商品数据保存在 cookie 中;如果用户已登录,将获取的更新数据保存在 redis 中。
① 获取参数
sku_id = request.POST.get("sku_id") # 商品id
count = request.POST.get("count") # 商品数量
② 参数校验
if not all([sku_id, count]):
return JsonResponse({"code": 1, "message": "参数不完整"})
③ 判断商品是否存在
try:
sku = GoodsSKU.objects.get(id=sku_id)
except GoodsSKU.DoesNotExist:
return JsonResponse({"code": 2, "message": "商品不存在"})
④ 判断库存
if count > sku.stock:
return JsonResponse({"code": 4, "message": "库存不足"})
⑤ 更新购物车数据
class UpdateCartView(View):
"""更新购物车数据"""
def post(self, request):
# 获取参数
sku_id = request.POST.get("sku_id") # 商品id
count = request.POST.get("count") # 商品数量
# 校验参数
if not all([sku_id, count]):
return JsonResponse({"code": 1, "message": "参数不完整"})
# 判断商品是否存在
try:
sku = GoodsSKU.objects.get(id=sku_id)
except GoodsSKU.DoesNotExist:
return JsonResponse({"code": 2, "message": "商品不存在"})
# count是否是整数
try:
count = int(count)
except Exception:
return JsonResponse({"code": 3, "message": "数量异常"})
# 判断库存
if count > sku.stock:
return JsonResponse({"code": 4, "message": "库存不足"})
# 保存购物车数据
if not request.user.is_authenticated():
# 如果用户未登录,保存在cookie中
cart_json = request.COOKIES.get("cart")
if cart_json is not None:
cart = json.loads(cart_json)
else:
cart = {}
# 将商品的数据保存到购物车中
cart[sku_id] = count
# 将购物车数据保存到cookie中
response = JsonResponse({"code": 0, "message": "修改成功"})
response.set_cookie("cart", json.dumps(cart))
return response
else:
# 如果用户已登录,保存在redis中
user_id = request.user.id
redis_conn = get_redis_connection("default")
redis_conn.hset("cart_%s" % user_id, sku_id, count)
return JsonResponse({"code": 0, "message": "修改成功"})