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

flo*_*urr 4 python django overriding django-models

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

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()
Run Code Online (Sandbox Code Playgroud)

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

RemovedInDjango18Warning:commit_manually已弃用,支持set_autocommit.

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

knb*_*nbk 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)
Run Code Online (Sandbox Code Playgroud)

但是,这相当于使用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
Run Code Online (Sandbox Code Playgroud)

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