django多个模型保存单个提交

时间:2015-08-07 21:10:16

标签: django django-models

在我看来,我在多个模型中保存数据:

 %   /usr/lib64/naemon/plugins//check_int.pl -H 10.61.146.227 -C sparkred -2 -n bond0  -w -z -f -e -S -k -Y -B


 bond0:UP (1717.9Kbps/3854.1Kbps), bond0.1422:UP (19.0Kbps/326.0Kbps) (2 UP): OK |  'bond0_in_bps'=1717881;;; 'bond0_out_bps'=3854092;;;  'bond0.1422_in_bps'=19023;;; 'bond0.1422_out_bps'=325999;;;

如果def myview(request): #do some processing model1.save() model2.save() 引发错误,如何确保回滚model1.save()。或者只有在两个模型都成功保存后才能提交?

换句话说,"如果save()都成功,只保存model1和model2"

2 个答案:

答案 0 :(得分:24)

使用atomic transaction

  

Atomicity是数据库事务的定义属性。 atomic允许我们创建一个代码块,在该代码块中保证数据库的原子性。 如果代码块成功完成,则更改将提交到数据库。如果存在异常,则会回滚更改。

示例:

from django.db import transaction

with transaction.atomic():
    model1.save()
    model2.save()

from django.db import transaction

try:
    with transaction.atomic():
        model1.save()
        model2.save()
except IntegrityError:
    handle_exception()

答案 1 :(得分:1)

使用 decorator 的替代解决方案:

from django.db import transaction

@transaction.atomic
def myview(request):
    # This code executes inside a transaction.
    model1.save()
    model2.save()