django中使用事务及接入支付宝支付功能

  

之前一直想记录一下在项目中使用到的事务以及支付宝支付功能,自己一直犯懒没有完,趁今天有点兴致,在这记录一下。

  

商城项目必备的就是支付订单的功能,所以就会涉及到订单的保存以及支付接口的引入。先来看看订单的保存,在数据库模型涉及之初,将订单分成了两个表,一个为订单表,记录订单的基本信息,如订单号,用户信息,运费之类,一个为订单商品表,记录该订单中的商品信息。在保存订单时,肯定会涉及到两个表的新建和保存,其实还有一张表也需要进行一些修改,那就是商品表,当一个订单保存成功,意味着本次交易成功,商品售出,商品的库存应该进行修改,所以,在保存订单这一操作中,涉及到的表有三张,所以在保存订单时,多表数据的修改,要嘛同时成功,要嘛同时失败,这就跟数据库中的事务很像,因此,在这里引入事务,来完成订单保存的功能。

  

在Django中可以通过<代码> django.db。事务代码模块提供的原子来定义一个事务,原子提供两种用法,一种是装饰器,一种是与语句。

        django。db进口事务   @transaction.atomic   def viewfunc(请求):   #这些代码会在一个事务中执行   …   django。db进口事务   def viewfunc(请求):   #这部分代码不在事务中,会被Django自动提交   …   与transaction.atomic ():   #这部分代码会在事务中执行   …之前      


  

  

在Django中,还提供了保存点的支持,可以在事务中创建保存点来记录数据的特定状态,数据库出现错误时,可以恢复到数据保存点的状态

        django。db进口事务   #创建保存点   save_id=transaction.savepoint ()   #回滚到保存点   transaction.savepoint_rollback (save_id)   #提交从保存点到当前状态的所有数据库事务操作   transaction.savepoint_commit (save_id)      

所以,可以在序列化器的制造方法中,创建一个事务,还进行数据的修改保存还有新建,若有地方出的错,则直接回滚,若没有问题则提交事务。代码如下

  

,,,

        def创建(自我,validated_data):““保存订单”“#获取当前下单用户用户=self.context(“请求”)。用户#组织订单编号20170903153611 +用户。# timezone.now id ()→datetime order_id=timezone.now () .strftime (Y ' % % m % d % H % m % S ') +(' % 09年d ' % user.id)地址=validated_data['地址']pay_method=validated_data [' pay_method '] #生成订单与transaction.atomic(): #创建一个保存点save_id=transaction.savepoint()尝试:#创建订单信息=OrderInfo.objects秩序。创建(order_id=order_id、用户=用户地址=地址total_count=0, total_amount=小数(0),运费=小数(10),pay_method=pay_method状态=OrderInfo。ORDER_STATUS_ENUM [' UNSEND ']如果pay_method==OrderInfo。PAY_METHODS_ENUM其他OrderInfo“现金”。ORDER_STATUS_ENUM[“无偿”])#获取购物车信息redis_conn=get_redis_connection redis_cart=redis_conn(“购物车”)。hgetall (cart_ % s % user.id) cart_selected=redis_conn。smembers (' cart_selected_ % s ' % user.id) #将字节类型转换为int类型车={}sku_id cart_selected:购物车int [int (sku_id)]=(redis_cart [sku_id]) # #一次查询出所有商品数据# sku=SKU.objects.filter (id__in=cart.keys()) #处理订单商品sku_id_list=cart.keys sku_id在sku_id_list():当如此:sku=SKU.objects.get (id=sku_id) sku_count=购物车(sku。id] #判断库存origin_stock=sku。股票#原始库存origin_sales=sku。销售#原始销量如果sku_count比;origin_stock: transaction.savepoint_rollback (save_id)提高serializers.ValidationError(“商品库存不足”)#用于演示并发下单进口时间# time . sleep(5) # #减少库存# sku。股票-=sku_count # sku。销售+=sku_count # sku.save () new_stock=origin_stock - sku_count new_sales=origin_sales + sku_count #根据原始库存条件更新,返回更新的条目数,乐观锁ret=SKU.objects.filter (id=sku。id、股票=origin_stock)。更新(股票=new_stock销售=new_sales)如果ret==0:继续#累计商品的SPU销量信息sku.goods。销售+=sku_count sku.goods.save() #累计订单基本信息的数据。total_count +=sku_count #累计总金额。total_amount +=(sku。价格* sku_count) #累计总额#保存订单商品OrderGoods.objects。创建(订单=订单,sku=sku,数=sku_count价格=sku。价格,)#更新成功打破#更新订单的金额数量信息。除了序列化器total_amount +=order.freight order.save ()。ValidationError:提高除了异常e: logger.error (e) transaction.savepoint_rollback (save_id)提高#提交事务transaction.savepoint_commit (save_id) #更新复述中保存的购物车数据pl=redis_conn.pipeline () pl.hdel (cart_ % s %用户。id、* cart_selected) pl.srem (cart_selected_ % s %用户。id、* cart_selected) pl.execute()返回订单

django中使用事务及接入支付宝支付功能