Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Django实战-生鲜电商-提交订单

Django实战-生鲜电商-提交订单

作者头像
小团子
发布于 2019-07-18 08:07:02
发布于 2019-07-18 08:07:02
63300
代码可运行
举报
文章被收录于专栏:数据云团数据云团
运行总次数:0
代码可运行

在完成了前一小节的数据库事务,提交订单的视图类就可以直接继承 mixin 类。

① 创建事务保存点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建事务保存点
        save_id = transaction.savepoint()
        try:
            order = OrderInfo.objects.create(
                order_id=order_id,
                user=user,
                address=address,
                total_amount=0,
                trans_cost=10,
                pay_method=pay_method,
            )

② 回退的保存点的状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 回退的保存点的状态
transaction.savepoint_rollback(save_id)

③ 提交订单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CommitOrderView(LoginRequiredJsonMixin, TransactionAtomicMixin, View):
    """提交订单"""
    def post(self, request):
        # 获取参数
        #  user 地址id  支付方式  商品id  数量(从购物车中获取)
        user = request.user
        address_id = request.POST.get("address_id")
        sku_ids = request.POST.get("sku_ids")  # "1,2,3,4"
        pay_method = request.POST.get("pay_method")

        # 校验参数
        if not all([address_id, sku_ids, pay_method]):
            return JsonResponse({"code": 2, "message": "参数缺失"})

        # 判断地址是否存在
        try:
            address = Address.objects.get(id=address_id)
        except Address.DoesNotExist:
            return JsonResponse({"code": 3, "message": "地址不存在"})

        # 判断支付方式
        pay_method = int(pay_method)
        if pay_method not in OrderInfo.PAY_METHODS.keys():
            return JsonResponse({"code": 4, "message": "支付方式错误"})

        # 判断商品
        sku_ids = sku_ids.split(",")   # ["1", "2"]
        redis_conn = get_redis_connection("default")
        cart = redis_conn.hgetall("cart_%s" % user.id)

        # 创建一个订单基本信息表数据

        # 自定义的order_id  "20171026111111用户id"
        order_id = timezone.now().strftime("%Y%m%d%H%M%S") + str(user.id)

        # 创建事务保存点
        save_id = transaction.savepoint()
        try:
            order = OrderInfo.objects.create(
                order_id=order_id,
                user=user,
                address=address,
                total_amount=0,
                trans_cost=10,
                pay_method=pay_method,
            )

            total_count = 0  # 总数
            total_amount = 0  # 总金额
            for sku_id in sku_ids:
                for i in range(3):
                    try:
                        sku = GoodsSKU.objects.get(id=sku_id)
                    except GoodsSKU.DoesNotExist:
                        # 回退的保存点的状态
                        transaction.savepoint_rollback(save_id)
                        return JsonResponse({"code": 5, "message": "商品有误"})

                    # 获取订购的商品数量,判断库存
                    sku_count = cart.get(sku_id.encode())
                    sku_count = int(sku_count)
                    if sku_count > sku.stock:
                        # 回退的保存点的状态
                        transaction.savepoint_rollback(save_id)
                        return JsonResponse({"code": 6, "message": "库存不足"})

                    # 减少商品的库存, 增加商品的销量
                    origin_stock = sku.stock
                    new_stock = origin_stock - sku_count
                    new_sales = sku.sales + sku_count
                    # update操作会返回受影响的行数,即更新成功的函数
                    result = GoodsSKU.objects.filter(id=sku_id, stock=origin_stock).update(stock=new_stock, sales=new_sales)
                    if result == 0 and i < 2:
                        # 表示更新失败
                        continue
                    elif result == 0 and i == 2:
                        # 表示尝试三次失败
                        transaction.savepoint_rollback(save_id)
                        return JsonResponse({"code": 7, "message": "下单失败"})

                    # 保存订单商品
                    OrderGoods.objects.create(
                        order=order,
                        sku=sku,
                        count=sku_count,
                        price=sku.price,
                    )

                    # 累计计算总数
                    total_count += sku_count
                    # 累计计算总金额
                    total_amount += (sku.price * sku_count)

                    # 跳出三次循环,处理下一个商品
                    break

            # 修改订单基本信息表中的统计数据字段
            order.total_count = total_count
            order.total_amount = total_amount + 10
            order.save()

        except Exception:
            # 出现任何异常,都要回退的保存点的状态
            transaction.savepoint_rollback(save_id)
            return JsonResponse({"code": 8, "message": "下单失败"})

        # 执行成功,提交事务
        transaction.savepoint_commit(save_id)

        # 保存最新的购物车数据
        redis_conn.hdel("cart_%s" % user.id, *sku_ids)  # 删除订购的商品

        # 返回前端json状态
        return JsonResponse({"code": 0, "message": "创建订单成功"})
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据云团 微信公众号,前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
文章目录 一、订单确认功能实现 1.后台处理逻辑 2.JS 二、订单支付成功页面 1.后台逻辑 2.页面设计 3.实际效果 一、订单确认功能实现 1.后台处理逻辑 class OrderView(LoginRequiredJSONMixin,View): def post(self,request): # 这里省略了很多操作,这些操作不需要事务 # 1.订单信息 # 1.1 获取用户信息 user = request.u
愚公搬代码
2022/02/07
5120
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
Django实战-生鲜电商-订单支付
订单支付使用的是支付宝的API。需要到蚂蚁金服开放平台注册账号,申请 网页&移动应用 支付。如果申请还未通过,可以使用沙箱环境进行测试。在本地项目运行环境中需要安装支付宝的SDK。
小团子
2019/07/18
8440
Django实战-生鲜电商-订单支付
Django实战-生鲜电商-用户地址|订单确认
在完成登录到用户提交订单,这一系列的类视图函数,会发现有大量的数据读写操作,像电商这类的项目,更多的是用户在浏览页面的次数比较多,所以在数据查询的场景中都会采用缓存,将用户第一次打开页面,到下一次重新浏览,这其间就可以提升用户打开页面的速度。
小团子
2019/07/18
6840
Django实战-生鲜电商-用户地址|订单确认
Django实战-生鲜电商-订单评论
经过几轮的视图类的编写,整个电商项目的逻辑有清晰一点了么?对于事务逻辑的数据处理,分为查询和创建。相对于本项目来说,创建的操作大多数在用户下单到支付成功这一过程,所以在提交订单的类中,用到了数据库事务,对数据的一致性处理提供了保障。
小团子
2019/07/18
5180
Django实战-生鲜电商-订单评论
【愚公系列】2022年02月 Django商城项目 32-订单页面设计
文章目录 一、订单页面设计 1.HTML 2.JS 3.后端业务逻辑 二、页面效果 一、订单页面设计 1.HTML <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http
愚公搬代码
2022/02/05
4510
【愚公系列】2022年02月 Django商城项目 32-订单页面设计
Django实战-生鲜电商-查询支付结果
完成了订单支付,用户需要在个人中心看到商品的支付结果,需要从数据库查询用户成功支付的订单,通过订单编号可以获取到每份订单的信息。
小团子
2019/07/18
6470
Django实战-生鲜电商-查询支付结果
Django实战-生鲜电商-用户中心|商品详情
完成了项目的模型层,最需要思考的是数据库该如何设计?这次的电商项目,从用户到下单,都会有哪些操作呢?当看到页面的那些商品信息或是活动促销信息,有考虑过它们之间的联系么?要是,商品的分类要像某宝或是某东,那样有二级和三级分类,这样又该怎么处理呢?如果每个功能的数据表都单独设计成和用户关联,那功能的不断扩展,会不会影响到整个数据库读写与查询呢?
小团子
2019/07/18
6930
Django实战-生鲜电商-用户中心|商品详情
电商数据分析-02-电商业务介绍及表结构
电商业务简介 大数据项目之电商数仓、电商业务简介、电商业务流程、电商常识、业务数据介绍、电商业务表、后台管理系统
IT从业者张某某
2023/12/27
6030
电商数据分析-02-电商业务介绍及表结构
美多商城项目(九)
Dream big dreams. Small dreams have no magic.
小闫同学啊
2019/07/18
1.1K0
美多商城项目(九)
【愚公系列】2022年01月 Django商城项目 30-购物车功能实现
文章目录 一、添加购物车 1.后端逻辑代码 2.前台请求接口代码 3.实际效果 二、获取购物车 1.后端逻辑代码 2.前台页面代码 3.实际效果 三、更新购物车 1.后端逻辑代码 2.前台页面代码 3.实际效果 四、删除购物车 1.后端逻辑代码 2.前台页面代码 五、合并购物车 一、添加购物车 1.后端逻辑代码 """ 一 前后端需求分析需求 前端需要收集: 商品id,商品数量, 选中是可选的(默认就是选中) 如果用户登陆了则请求携带session id
愚公搬代码
2022/02/04
6070
【愚公系列】2022年01月 Django商城项目 30-购物车功能实现
【新星计划】【Django】基于PythonWeb的Django框架设计实现天天生鲜系统-10订单提交成功页面功能实现
当购物车商品数据确认无误之后, 点击结算按钮跳转到订单提交页面, 在该页面用户就需要填写收货地址、联系电话、联系人等信息.
天道Vax的时间宝藏
2021/08/11
7900
Django实战-生鲜电商-购物车信息
在上一小节中,会发现加入购物车,如果用户未登录,是将添加到购物车的商品存储在浏览器的 cookie 中;如果用户已登录,则保存购物车数据到redis中,然后是返回处理结果。
小团子
2019/07/18
5260
Django实战-生鲜电商-购物车信息
Django实战-生鲜电商-加入购物车
用户在进入个人中心前,都需要判断用户是否登录。在加入购物车之前,判断商品是否存在。如果用户已登录,则保存购物车数据到redis中;操作redis,保存购物车数据,"cart_用户id": {"sku_1": 10, "sku_2": 11},先尝试从用户的购物车中获取这个商品的数量;如果购物车中不存在这个商品,则直接添加购物车记录,否则,需要进行数量的累计,再添加到购物车记录中。
小团子
2019/07/18
7880
Django实战-生鲜电商-加入购物车
【愚公系列】2022年02月 Django商城项目 31-订单模型数据库设计
实际中订单设计远不止这些,上面哪些只是案例流程,实际按需求设计,下面是个比较完整的设计:
愚公搬代码
2022/02/05
8400
【愚公系列】2022年02月 Django商城项目 31-订单模型数据库设计
Django实战-生鲜电商-模型层
经过前几小节的介绍,ORM 的基础应用,如何把一张数据表建好,方便各张表之间的数据处理。从第一张用户表开始,就意味着整个站点的数据表能有多大的扩展能力。
小团子
2019/07/18
5900
Django实战-生鲜电商-模型层
Django实战-生鲜电商-更新购物车数据
同样,用户更新购物车信息,需要判断商品是否存在,如果用户未登录,将商品数据保存在 cookie 中;如果用户已登录,将获取的更新数据保存在 redis 中。
小团子
2019/07/18
7250
Django实战-生鲜电商-更新购物车数据
美多商城项目(十)
It is time to shed the burdens of the past year and come up fresh and alive.
小闫同学啊
2019/07/18
1.7K0
美多商城项目(十)
Django实战-生鲜电商-删除购物车数据|退出
经过前两小节的了解,也知道了购物车的商品数据可以保存在 cookie 和 redis 中。同样是先要获取到商品的id,再到用户的购物车中查询到这条数据。会发现,存入到 cookie 的商品数据是 json 数据格式。
小团子
2019/07/18
7610
Django实战-生鲜电商-删除购物车数据|退出
实时数仓|基于Flink1.11的SQL构建实时数仓探索实践
实时数仓主要是为了解决传统数仓数据时效性低的问题,实时数仓通常会用在实时的OLAP分析、实时的数据看板、业务指标实时监控等场景。虽然关于实时数仓的架构及技术选型与传统的离线数仓会存在差异,但是关于数仓建设的基本方法论是一致的。本文会分享基于Flink SQL从0到1搭建一个实时数仓的demo,涉及数据采集、存储、计算、可视化整个处理流程。通过本文你可以了解到:
Spark学习技巧
2020/09/08
1.9K0
实时数仓|基于Flink1.11的SQL构建实时数仓探索实践
Django实战-生鲜电商-路由
在项目的主目录 urls.py 文件中,配置 用户、商品、订单、购物车的主路由。 from django.conf.urls import include, url from django.contr
小团子
2019/07/18
4570
Django实战-生鲜电商-路由
推荐阅读
相关推荐
【愚公系列】2022年02月 Django商城项目 33-订单确认功能实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验