我正在运行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实现相同的逻辑?
答案 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