1.導入模塊包
from django.db import transaction
2.設置回滾點
with transaction.atomic(): save_id = transaction.savepoint() # 設置回滾點 try: order = Order.objects.create( order_title=order_title, total_price=total_price, real_price=real_price, order_number=order_number, order_status = 0, pay_type=pay_type, credit=credit, coupon=coupon, user_id=user_id ) # 記錄當前訂單定義的課程信息到訂單詳情 redis_conn = get_redis_connection("cart") cart_hash = redis_conn.hgetall("cart_%s" % user_id) selected_set = redis_conn.smembers("selected_%s" % user_id) # 開啟redis事務 pipe = redis_conn.pipeline() pipe.multi() # 計算取當前課程的總價格價格 total_price = 0 coupon_price = 0 for course_id_bytes in selected_set: course_id = course_id_bytes.decode() expire_time = int( cart_hash.get(course_id_bytes).decode() ) # 根據當前課程ID來獲取課程信息 course = Course.objects.get(pk=course_id) # 把課程信息添加到訂單詳情里面 order_detail = OrderDetail.objects.create( order=order, course=course, expire=expire_time, price=course.real_price(expire_time), real_price=course.real_price(expire_time), # todo 將來完成優惠券或者積分的時候計算真實的價格 discount_name="原價購買", # todo 將來完成了優惠以后,這里進行調整 ) # 從購物車中刪除對應的商品課程 pipe.hdel("cart_%s" % user_id, course_id) pipe.srem("selected_%s" % user_id, course_id) total_price += float(order_detail.price) # 計算訂單的總價格 # 判斷是否使用了積分,,如果使用了積分,則積分抵扣的金額 if credit > 0: # 判斷是否使用了優惠券,如果使用了優惠券,則計算優惠券的抵扣金額 credit_price = credit / constants.CREDIT_MONEY if coupon > 0: user = self.context["request"].user coupon = validated_data.get("coupon") now_time = datetime.now() try: result = UserCoupon.objects.get(pk=coupon, is_show=True, is_deleted=False, user_id=user.id, start_time__lt=now_time, end_time__gt=now_time) except UserCoupon.DoesNotExist: raise serializers.ValidationError("對不起,當前優惠券不存在或者已經過期不可用!") sale = result.coupon.sale if result.coupon.coupon_type == 0: # 折扣優惠 coupon_price = total_price * (1-float(sale[1:])) else: # 減免優惠 coupon_price = float(sale[1:] ) # 提交redis事務操作 pipe.execute() #保存總價格和實付價格到訂單里面 order.total_price = total_price order.real_price = total_price - credit/constants.CREDIT_MONEY - coupon_price order.save() except: transaction.savepoint_rollback(save_id) return serializers.ValidationError("訂單生成失敗!")