首页
学习
活动
专区
圈层
工具
发布

Django实战-生鲜电商-数据库事务

在订单确认中,涉及到获取参数、校验参数;查询商品数据,判断是否为购物车的商品,遍历商品 id,获取商品信息;读取商品的数量,计算商品的金额,判断库存,需要用户的地址信息。

一、提交订单

① 在提交之前,需要验证用户是否登录

构造登录验证的函数

代码语言:javascript
代码运行次数:0
复制
def login_required_json(view_func):
    @wraps(view_func)
    def wrapper(request, *args, **kwargs):
        if not request.user.is_authenticated():
            # 如果用户未登录,返回json数据
            return JsonResponse({"code": 1, "message": "用户未登录"})
        else:
            # 如果用户登录,则进入到视图函数中执行
            return view_func(request, *args, **kwargs)
    return wrapper

在将登录验证的视图封装到 mixin 类中。

代码语言:javascript
代码运行次数:0
复制
class LoginRequiredJsonMixin(object):
    @classmethod
    def as_view(cls, **initkwargs):
        view = super(LoginRequiredJsonMixin, cls).as_view(**initkwargs)
        return login_required_json(view)

② 增加数据库事务功能

事务(Transaction)是并发控制的基本单位。所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把它们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。

代码语言:javascript
代码运行次数:0
复制
from django.contrib.auth.decorators import login_required
from django.http import JsonResponse
from functools import wraps
from django.db import transaction
代码语言:javascript
代码运行次数:0
复制
class TransactionAtomicMixin(object):
    """提供数据库事务功能"""
    @classmethod
    def as_view(cls, **initkwargs):
        view = super(TransactionAtomicMixin, cls).as_view(**initkwargs)
        return transaction.atomic(view)
下一篇
举报
领券