Django模型:在不推荐使用commit_manually时管理事务

时间:2015-06-08 11:00:05

标签: python django django-models override

我正在运行Django 1.4.11。我以类似于以下代码的方式覆盖Django模型的save()方法:

from django.db import models
from django.db import transaction

class MyModel(models.Model):
    # model definition

    @transaction.commit_manually
    def save(self, *args, **kwargs):
        try:
            super(self.__class__, self).save(*args, **kwargs)
            foo() # do_other_things
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()

当我运行我的代码时,有时我会在Apache日志中阅读此消息:

  

RemovedInDjango18Warning:commit_manually已弃用,赞成使用   set_autocommit。

如何使用set_autocommit实现相同的逻辑?

2 个答案:

答案 0 :(得分:11)

同样的逻辑看起来像这样:

from django.db import models
from django.db import transaction

class MyModel(models.Model):
    # model definition

    def save(self, *args, **kwargs):
        transaction.set_autocommit(False)
        try:
            super(MyModel, self).save(*args, **kwargs)
            foo() # do_other_things
        except:
            transaction.rollback()
            raise
        else:
            transaction.commit()
        finally:
            transaction.set_autocommit(True)

但是,这相当于使用atomic()装饰器:

from django.db import models
from django.db import transaction

class MyModel(models.Model):
    # model definition

    @transaction.atomic
    def save(self, *args, **kwargs):
        super(MyModel, self).save(*args, **kwargs)
        foo() # do_other_things

这将在成功的__exit__上提交事务,并在异常的情况下回滚。

答案 1 :(得分:1)

对于您提供的示例,您只需使用transaction.atomic 即可。如果代码成功,则将提交整个事务。如果存在异常,则将回滚更改。

@transaction.atomic
def save(self, *args, **kwargs):
    super(self.__class__, self).save(*args, **kwargs)
    foo() # do_other_things