赞
踩
课程Id为Key值,后面是用户课程的全部信息(包括优惠券字典和价格策略字典)
第一步:构造存入redis的两个数据格式(方便下面存储数据),取出前端传来的课程列表
第二步:从redis中取出该用户的购物车(如果不存在则创建一个空的),判断前端传来的课程是否全在购物车中,如果不在则抛异常,如果存在,则把共同的课程定义一个字典(以key为键,value为字典当道最后的打字典中)
第三步:获取当前时间,过滤优惠券里面的时间,满足条件的放到一个列表中
第四步:循环优惠券列表,获取优惠券的类型,然后根据优惠券的类型,添加相应的字段到对应的字典中,判断是全栈优惠券,还是课程优惠券,把全栈优惠券放到单独的优惠券列表,课程优惠券放到对应的课程字典中
第五步:把对应的两个字典存入redis
from rest_framework.views import APIView from rest_framework.response import Response # 表模板的导入 from api import models # 自定义返回值导入 from api.utils.commonUtils import MyResponse from api.utils.MyAuth import LoginAuth from api.utils.commonUtils import CommonException from django_redis import get_redis_connection import json # 需要登录之后才能操作,写一个认证组件 class settlement(APIView): authentication_classes = [LoginAuth] conn = get_redis_connection() def post(self, request, *args, **kwargs): response = MyResponse() # 前端传来的数据格式{"course_list": [{"course_id": "1", "policy_id": "1"}, {"course_id": "2", "policy_id": "2"}]} course_list = request.data.get('course_list') try: # 构造出结算中心和全局优惠券字典(存在redis中,有两个表,一个是要结算的课程列表,一个是优惠券列表) payment_dic = {} global_coupon = { 'coupon': {}, 'default_coupon': 0 } # 去redis中取出该用户的购物车 shoppingcart = self.conn.get('shoppingcart_%s' % request.user.pk) # 三元表达式(判断该用户是否存在购物车) shoppingcart_dic = json.loads(shoppingcart) if shoppingcart else {} # 循环前端传过来的课程列表.然后把购物车中的与结算课程对应的放到新定义的课程详情列表 for course_in in course_list: # 判断课程id是否在购物车中,如果不在,直接抛异常 course_in_id = course_in['course_id'] if course_in_id not in shoppingcart_dic: raise CommonException(101, '该课程不在购物车中') # 定义一个空的课程详情字典,内部放了一个空的优惠券字典和一个优惠券默认值 course_detail = { 'coupon': {}, 'default_coupon': 0 } # 把购物车里面的课程放到刚定义的课程详情列表中 course_detail.update(shoppingcart_dic[course_in_id]) # 把刚构造的课程详情列表,放到结算中心字典 payment_dic[course_in_id] = course_detail # 下面构造优惠券列表 # 一次性查出当前用户的所有优惠券信息 import datetime ctime = datetime.datetime.now() # 过滤取出该用户的所有满足条件的所有优惠券 coupon_list = models.CouponRecord.objects.filter(user=request.user, status=0, coupon__valid_end_date__gte=ctime, coupon__valid_begin_date__lte=ctime ) for coupon in coupon_list: # 拿出所有优惠券的数字类型 coupon_type = coupon.coupon.coupon_type # 拿出优惠券类型的文字描述 coupon_type_display = coupon.coupon.get_coupon_type_display() # 每个优惠券绑定的课程 object_id = coupon.coupon.object_id # 优惠券详情字典中 coupon_detail = { 'coupon_type': coupon_type, 'coupon_display': coupon_type_display } # 此时优惠券详情字典中的信息 # coupon_detail={ # "coupon_type":1, # "coupon_display":"满减券", # "money_equivalent_value":10, # "minimum_consume":100 # } # 下面对优惠券的种类,用三种字段表示 if coupon_type == '0': # 立减 coupon_detail['money_equivalent_value'] = coupon.coupon.money_equivalent_value elif coupon_type == '1': # 满减 coupon_detail['money_equivalent_value'] = coupon.coupon.money_equivalent_value coupon_detail['minimum_consume'] = coupon.coupon.minimum_consume else: # 折扣 coupon_detail['off_percent'] = coupon.coupon.off_percent # 全栈优惠券 if not object_id: global_coupon['coupon'][str(coupon.pk)] = coupon_detail else: # 课程优惠券 if payment_dic.get(str(object_id), None): payment_dic[str(object_id)]['coupon'][str(coupon.pk)] = coupon_detail # 存到redis self.conn.set('payment_%s' % request.user.pk, json.dumps(payment_dic)) self.conn.set('globalcoupon_%s' % request.user.pk, json.dumps(global_coupon)) response.msg = '加入成功' except CommonException as e: response.status = e.status response.msg = e.msg except Exception as e: response.status = 400 response.msg = '未知错误' print(str(e)) return Response(response.get_dic)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。