【问题标题】:How do I save multiple django models in a single transaction?如何在单个事务中保存多个 django 模型?
【发布时间】:2015-10-31 10:15:27
【问题描述】:

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

def myview(request):
    #do some processing
    model1.save()
    model2.save()

如果model2.save() 引发错误,我如何确保回滚model1.save()?或者只有在两个模型都成功保存后我如何提交?

换句话说,“只有在 save() 都成功时才保存 model1 和 model2”,或者“在事务中执行两个保存”。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    使用atomic transaction

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

    例子:

    from django.db import transaction
    
    with transaction.atomic():
        model1.save()
        model2.save()
    

    from django.db import transaction, IntegrityError
    
    try:
        with transaction.atomic():
            model1.save()
            model2.save()
    except IntegrityError:
        handle_exception()
    

    【讨论】:

    • 导入事务应该是:from django.db import transaction
    【解决方案2】:

    使用decorator 的替代解决方案:

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

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多