在基于类的视图中使用@ transaction.atomic保存模型

时间:2017-04-15 06:30:57

标签: python django django-models django-views

我正在尝试处理添加新对象和编辑对象。我的views.py文件就像 -

personal_data=Personal.objects.create(emp_fname=first_name, emp_mname=middle_name, emp_lname=last_name)
# rest of object is created here
try: 
    print "pk", pk
    with transaction.atomic(): 
        if pk != None:
            print "hey"
            #save model goes here
            messages.add_message(request, messages.INFO, 'Data updated successfully')
        else:
            print "hello"
            personal_data.save()
            family_data.save()
            address_data.save()
            education_data.save()
            pre_company_data.save()
            messages.add_message(request, messages.INFO, 'Data saved successfully')
except IntegrityError: 
    handle_exception() 

if-else条件正常工作但两种情况下都保存了数据。即使我评论了上面显示的代码,数据仍会传输到数据库。

1 个答案:

答案 0 :(得分:1)

如果您的意思是在两种情况下都保存了personal_data,那是因为您正在调用Personal.objects.create,它会在一个步骤中创建并保存模型(参考:https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects) 。如果要将创建与保存分开,请使用通常的构造函数创建模型:

personal_data = Personal(emp_fname=first_name, emp_mname=middle_name, emp_lname=last_name)

try:
    with transaction.atomic(): 
    if pk != None:
        # do stuff
    else:
        personal_data.save()
        # do some other stuff
except IntegrityError: 
    handle_exception() 

在这种情况下,personal_data模型将仅在 中保存在else分支中。