事务常用的两种方法
方法二更灵活
# 事务操作的两种常用方法 django V3.1.15
# 方法一、在view函数使用装饰器
from django.db import transaction
# 开启事务
@transaction.atomic()
def register(request):
form = account.RegisterModelForm()
print(form)
if request.method == 'POST':
print(f"post content -------------->{request.POST}")
form = account.RegisterModelForm(data=request.POST) # 将用户提交的数据,传给RegisterModelForm
if form.is_valid(): # 开启字段校验
# 保存用户信息
user = form.save()
# 生成交易记录
price_policy = models.PricePolicy.objects.filter(category=1, title='个人免费版').first()
print(user.id, price_policy.id)
models.Transaction.objects.create(
status=2,
order=''.join(str(uuid4()).split('-')),
user_id=user.id,
price_policy_id=price_policy.id,
count=0,
price=0,
start_time=datetime.datetime.now()
)
# 修改用户状态
obj = models.UserInfo.objects.get(id=user.id)
obj.price_policy_id = 1
obj.save()
# 校验成功(注册成功)后,返回一个页面,让前端可以跳转到登录页面
return JsonResponse({'status': True, 'data': '/web/login/'})
else:
print("校验没通过,返回false")
return JsonResponse({'status': False, 'error': form.errors})
return render(request, 'web/register.html', {'form': form})
# 方法二、根据上下文,设置保存点
@transaction.atomic()
def register(request):
form = account.RegisterModelForm()
print(form)
if request.method == 'POST':
print(f"post content -------------->{request.POST}")
form = account.RegisterModelForm(data=request.POST) # 将用户提交的数据,传给RegisterModelForm
if form.is_valid(): # 开启字段校验
# with 设置回滚点,需要加入事务处理的内容放在with方法体内
with transaction.atomic():
# 保存用户信息
user = form.save()
# 生成交易记录
price_policy = models.PricePolicy.objects.filter(category=1, title='个人免费版').first()
print(user.id, price_policy.id)
models.Transaction.objects.create(
status=2,
order=''.join(str(uuid4()).split('-')),
user_id=user.id,
price_policy_id=price_policy.id,
count=0,
price=0,
start_time=datetime.datetime.now()
)
# 修改用户状态
obj = models.UserInfo.objects.get(id=user.id)
obj.price_policy_id = 1
obj.save()
# 校验成功(注册成功)后,返回一个页面,让前端可以跳转到登录页面
return JsonResponse({'status': True, 'data': '/web/login/'})
else:
print("校验没通过,返回false")
return JsonResponse({'status': False, 'error': form.errors})
return render(request, 'web/register.html', {'form': form})