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__,并在异常情况下回滚.
| 归档时间: |
|
| 查看次数: |
3973 次 |
| 最近记录: |