#?https://www.cnblogs.com/yloven/p/6964936.html
from django.db import transaction
#首先要導(dǎo)包
@transaction.atomic
@innerdef list(request):
post= request.POST
address = post.get('email')
cart_id=post.getlist('cart_id')
# 在調(diào)用一個(gè)view里面的方法之前逛揩,django開(kāi)始一個(gè)事務(wù)如果發(fā)出的響應(yīng)沒(méi)有問(wèn)題,
# Django就會(huì)提交這個(gè)事務(wù)。如果在view這里產(chǎn)生一個(gè)異常,Django就會(huì)回滾這次事務(wù)
# 開(kāi)啟事物保護(hù)
sid = transaction.savepoint()
try:
# 1.建立新的訂單信息
# transaction.savepoint_commit(sid)? #事物的提交
order = OrderInfo()
now = datetime.now()
uid = request.session['user_id']
order.oid=('%s%d')%(now.strftime('%Y%m%d%H%M%S'), uid)? # 拼接字符代碼
order.user_id=uid
order.udate = now
order.oaddress = address
print(order.oaddress,order.udate,order.user_id,order.oid,uid,now)
order.otatal=0
order.save()
total=0? # 計(jì)算好的總價(jià)
for cid in cart_id:
cart=CartInfo.objects.get(pk=cid)
# 2.判斷庫(kù)存,減少數(shù)據(jù)庫(kù)庫(kù)存
if cart.goods.gkucun>=cart.count:
cart.goods.gkucun-=cart.count
cart.goods.save()? ? ? ? # 連表保存數(shù)據(jù)庫(kù)的值
# 把信息添加訂單
datail = OrderDetailInfo()
datail.order=order? ? ? ? # 保存的外鍵對(duì)應(yīng)ID
datail.goods=cart.goods? ? ? ? ? #保存外鍵對(duì)應(yīng)Id
datail.price=cart.goods.gprice
datail.count=cart.count
# print(order,cart.goods,cart.goods.gprice)
datail.save()
# 計(jì)算總價(jià)
total+=cart.goods.gprice*cart.count
# 購(gòu)車用完了刪除
cart.delete()
else: # 購(gòu)車數(shù)量比庫(kù)存大
transaction.savepoint_rollback(sid) #事務(wù)的回滾
return redirect('/cart/')
order.ototal = total
print(total)
order.save() # 計(jì)算完了 保存總價(jià)格
transaction.savepoint_commit(sid) #提交事務(wù)的邏輯
return redirect('/user/order/1')
except :
# 發(fā)生異常就回滾
transaction.savepoint_rollback(sid)