路由
from django.urls import path
from carts.views import *
urlpatterns = [
# 加入购物车
path("user/cart/", UserCartAPIView.as_view())
]
购物车视图
import redis
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from collects.utils import check_login
from goods.models import Goods
# Create your views here.
# 自定义函数,组织购物车商品字典
def org_good_json(cart_key, good_id, num, check=False):
"""
:param cart_key:购物车id 如cart_1,cart_2,...
:param good_id: 购物车中商品id, int
:param num: 当前商品加购的数量,int
:param check: 当前商品的勾选状态 默认为 False
:return: 商品字典列表 如[{},{},{}...]
"""
# 根据商品id 查询商品对象
try:
good = Goods.objects.get(id=good_id)
except:
return {}
return {
"id": cart_key,
"productID": good.id,
"productName": good.sku_name,
"productImg": good.img,
"price": good.selling_price,
"num": num, # 该商品 在当前购物车中的数量
"maxNum": good.stock, # 限购数量
"check": check, # 购物车中该商品是否被勾选
}
# 购物车的视图
class UserCartAPIView(APIView):
# 添加购物车
@check_login
def post(self, request):
# 1,接受前端数据
good_id = request.data.get("productID")
uid = request.uid
# 2.根据商品id 查询商品对象
good = Goods.objects.filter(id=good_id).first()
if not good:
return Response({"code": 400, "msg": "加购的商品不存在"})
# 3.判断商品的库存
conn = redis.Redis(host="localhost", port=6379, password="123456")
# 构造用户的key
cart_key = "cart_%s" % uid
cart_selected_key = "cart_selected_%s" % uid
if good.stock > 0:
# 继续加够
# 是否第一次加购
num = conn.hget(cart_key, good_id)
if num:
# 不是第一次加购
num = int(num.decode()) + 1
if num <= good.stock:
# 可以正常加购
conn.hset(cart_key, good_id, num)
# 设置勾选状态
conn.sadd(cart_selected_key, good_id)
return Response({"code": 201, "msg": "该商品已经在购物车,数量+1"})
else:
# 不可以加购
return Response({"code": 202, "msg": "加购达到限购数量!"})
else:
# 第一次加购
conn.hset(cart_key, good_id, 1)
conn.sadd(cart_selected_key, good_id)
return Response({
"code": 200,
"msg": "新加入购物车成功",
"shoppingCartData": {
"id": cart_key,
"productID": good.id,