Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django:如果连续插入多个模型,如何在数据库中实现事务回滚?_Python_Django_Database_Transactions - Fatal编程技术网

Python Django:如果连续插入多个模型,如何在数据库中实现事务回滚?

Python Django:如果连续插入多个模型,如何在数据库中实现事务回滚?,python,django,database,transactions,Python,Django,Database,Transactions,我是Django的新手,我在互联网上搜索过这个话题,但我不理解。基本上,我正在创建一个学生用户,它将链接到Django中的内置用户模型。在我的代码中,我首先在用户模型中创建用户,然后在StudentUser模型中创建它。但是,如果发生错误,可能不是创建了StudentUser,我想撤消用户中的更改。如何通过回滚来解决这个问题 以下是我的代码片段: views.py def user_signup(request): if request.method == 'POST':

我是Django的新手,我在互联网上搜索过这个话题,但我不理解。基本上,我正在创建一个学生用户,它将链接到Django中的内置用户模型。在我的代码中,我首先在用户模型中创建用户,然后在StudentUser模型中创建它。但是,如果发生错误,可能不是创建了StudentUser,我想撤消用户中的更改。如何通过回滚来解决这个问题

以下是我的代码片段:

views.py

def user_signup(request):
    if request.method == 'POST':
        # Signup for student
        if(request.POST['stud_fname']):
            stud_fname = request.POST['stud_fname']
            stud_lname = request.POST['stud_lname']
            stud_uni = request.POST['stud_uni']
            stud_email = request.POST['stud_email']
            stud_password = request.POST['stud_passwd']

            try:
                user = User.objects.create_user(first_name=stud_fname, last_name=stud_lname, 
username=stud_email, password=stud_password)
                StudentUser.objects.create(user=user, university=stud_uni, user_type="Student")
                messages.success(request, "Account successfully created. You can now log in")
                return redirect('login')

            except:
                messages.error(request, "Failed to create account. Try again!")
                return render(request, 'signup.html')

    else:
        return render(request, 'signup.html')

您可以将transaction.atomic()用于希望创建全部或无的db查询。我已经编写了代码片段,您可以从这里参考:-

from django.db import transaction

def user_signup(request):
    if request.method == 'POST':
        # Signup for student
        if(request.POST['stud_fname']):
            stud_fname = request.POST['stud_fname']
            stud_lname = request.POST['stud_lname']
            stud_uni = request.POST['stud_uni']
            stud_email = request.POST['stud_email']
            stud_password = request.POST['stud_passwd']

            try:
                with transaction.atomic():
                    user = User.objects.create_user(first_name=stud_fname, last_name=stud_lname, username=stud_email, password=stud_password)
                    StudentUser.objects.create(user=user, university=stud_uni, user_type="Student")
                messages.success(request, "Account successfully created. You can now log in")
                return redirect('login')

            except:
                messages.error(request, "Failed to create account. Try again!")
                return render(request, 'signup.html')

    else:
        return render(request, 'signup.html')

您是否尝试实现数据库事务@AlbinPaul,不,我不知道在这种情况下如何做。如果发生任何错误,它是否也适合回滚?