前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >day99-redis入门&增删改查购物车&购物车数据结构

day99-redis入门&增删改查购物车&购物车数据结构

原创
作者头像
少年包青菜
修改2020-03-30 15:29:38
6380
修改2020-03-30 15:29:38
举报
文章被收录于专栏:Python 学习

1.启动redis

代码语言:javascript
复制
进入到redis解压目录
命令行运行redis-server.exe redis.windows.conf

2.python链接redis,根据具体需要的配置进入 ConnectionPool 里面查看并配置

代码语言:javascript
复制
# redis 连接池
POOL = redis.ConnectionPool(host='127.0.0.1',
                            port=6379,
                            decode_responses=True)

REDIS_CONN = redis.Redis(connection_pool=POOL)

3.redis的基础用法

3.1 .set() 和 .get()

3.2 .hset() 和 .hget()

3.3 .hmset() 和 .hgetall()

3.4 .scan_iter()

3.5 .exists()

3.6 .delete()

3.7 .keys()

4.字典的嵌套,注意 json 的序列化★★★★★

5.新增、删除、修改、查看购物车

代码语言:javascript
复制
class ShoppingCarView(APIView):
    authentication_classes = [authentication.MyAuthentication, ]

    @staticmethod
    def post(request):
        my_res = BaseResponse()
        # {"course_id": 1, "price_policy_id": 1}
        try:
            """1.判断课程是否合法"""
            course_id = request.data.get('course_id', '')
            course_obj = models.Course.objects.filter(id=course_id).first()
            if not course_obj:
                raise MyException(101, '课程非法或不存在!')

            """2.判断价格策略是否合法"""
            price_policy_id = request.data.get('price_policy_id', '')
            all_price_policy_query_set = course_obj.price_policy.all()
            if not all_price_policy_query_set.filter(id=price_policy_id).first():
                raise MyException(102, '价格策略不合法')

            """3.拿到课程信息"""
            course_info = {
                'title': course_obj.title,
                'course_img': str(course_obj.course_img),
                'category': course_obj.category.title,
                'course_type': course_obj.get_course_type_display(),
                'brief': course_obj.brief,
                'level': course_obj.get_level_display(),
            }

            """4.拿到所有的价格策略"""
            price_policy_dict = {}
            for price_policy_obj in all_price_policy_query_set.order_by('price'):
                price_policy_dict[price_policy_obj.id] = {
                    'valid_period': price_policy_obj.get_valid_period_display(),
                    'price': price_policy_obj.price
                }

            """5.组建购物车"""
            shopping_car_key = SHOPPING_CAR.format(request.user.pk, course_id)
            course_info['price_policy_dict'] = price_policy_dict
            course_info['default_price_policy_id'] = price_policy_id

            """6.将组建好的购物车写进 Redis"""
            course_info = json.dumps(course_info)
            REDIS_CONN.set(shopping_car_key, course_info)
            my_res.code = 100
            my_res.msg = '加入购物车成功!'

        except MyException as e:
            my_res.code = e.code
            my_res.msg = e.msg
        except Exception as e:
            my_res.code = -100
            my_res.msg = str(e)

        return Response(my_res.dict)

    @staticmethod
    def get(request):
        my_res = BaseResponse()
        try:
            user_id = request.user.pk
            shopping_car_key = SHOPPING_CAR.format(user_id, '*')
            """找到所有的keys"""
            all_shopping_car_keys = REDIS_CONN.scan_iter(shopping_car_key)
            if not all_shopping_car_keys:
                raise MyException(201, '购物车不存在')
            shopping_car = {}
            for key in all_shopping_car_keys:
                shopping_car[key] = json.loads(
                    REDIS_CONN.get(key)
                )
            my_res.code = 200
            my_res.msg = 'SUCCESS'
            my_res.data = shopping_car

        except MyException as e:
            my_res.code = e.code
            my_res.msg = e.msg

        except Exception as e:
            my_res.code = -200
            my_res.msg = str(e)

        return Response(my_res.dict)

    @staticmethod
    def put(request):
        my_res = BaseResponse()
        # {"course_id": 1, "price_policy_id": 1}
        try:
            """1.检查课程id是否存在于redis中"""
            course_id = request.data.get('course_id', '')
            shopping_car_key = SHOPPING_CAR.format(request.user.pk, course_id)
            if not REDIS_CONN.exists(shopping_car_key):
                raise MyException(301, '购物车不存在此课程')

            """2.判断价格策略是否合法"""
            price_policy_id = request.data.get('price_policy_id', '')
            price_policy_query_set = models.Course.objects.filter(id=course_id).first().price_policy.all()
            if not price_policy_query_set.filter(id=price_policy_id):
                raise MyException(402, '价格策略不合法')

            """3.从Redis里面找到该用户的购物车,修改后重新写进 Redis"""
            shopping_car = json.loads(REDIS_CONN.get(shopping_car_key))
            shopping_car['default_price_policy_id'] = price_policy_id
            REDIS_CONN.set(shopping_car_key, json.dumps(shopping_car, ensure_ascii=True))
            my_res.code = 400
            my_res.msg = 'SUCCESS'
            my_res.data = shopping_car

        except MyException as e:
            my_res.code = e.code
            my_res.msg = e.msg
        except Exception as e:
            my_res.code = -400
            my_res.msg = str(e)
        return Response(my_res.dict)

    @staticmethod
    def delete(request):
        # 版本优化批量删除
        my_res = BaseResponse()
        try:
            """获取课程id,判断是否在Redis中"""
            course_id = request.data.get('course_id', '')
            shopping_car_key = SHOPPING_CAR.format(request.user.pk, course_id)
            if not REDIS_CONN.exists(shopping_car_key):
                raise MyException(501, '购物车不存在此课程')
            REDIS_CONN.delete(shopping_car_key)
            my_res.code = 500
            my_res.msg = '删除成功!'
        except MyException as e:
            my_res.code = e.code
            my_res.msg = e.msg
        except Exception as e:
            my_res.code = -500
            my_res.code = str(e)
        return Response(my_res.dict)

6.购物车数据结构

代码语言:javascript
复制
shopping_car = {
        # 购物车数据结构
        "shopping_car_ {}_ {}": {
            "id": "XXX",
            "title": "XXX",
            "course_img": "XXX",
            "price_policy_dict": {
                "valid_period": "XXX",
                "price": "XXX"
            },
            "default_price_policy_id": "XXX"
        },
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.启动redis
  • 2.python链接redis,根据具体需要的配置进入 ConnectionPool 里面查看并配置
  • 3.redis的基础用法
    • 3.1 .set() 和 .get()
      • 3.2 .hset() 和 .hget()
        • 3.3 .hmset() 和 .hgetall()
          • 3.4 .scan_iter()
            • 3.5 .exists()
              • 3.6 .delete()
                • 3.7 .keys()
                  • 4.字典的嵌套,注意 json 的序列化★★★★★
                    • 5.新增、删除、修改、查看购物车
                      • 6.购物车数据结构
                      相关产品与服务
                      云数据库 Redis
                      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
                      领券
                      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档