Django:如何在save方法中回滚

时间:2014-04-17 20:39:06

标签: django django-models

我们的应用需要在LDAP后端中同步他的数据。 例如:每次在django中保存的用户必须将某些数据保存在LDAP中。 为此,我们使用django ldap后端,它工作得很好。 开始时,我们在成员的post_save信号中写了同步代码。同步工作很好,但这样,如果LDAP由于任何原因失败,我们无法回滚数据库保存。 所以我们在overridded save方法中写入同步代码。但是在这里我们也找不到回滚的方法。 我们最接近的解决方案是:

@transaction.commit_manually
def save(self, *args, **kwargs):

    super(MyModel, self).save(*args, **kwargs)

    try:
        self.sync_with_ldap()
    except:
        transaction.rollback()
        raise
    else:
        transaction.commit()

此代码返回一个TransactionManagementError:“当'原子'块处于活动状态时,这是禁止的。”

我们该如何做到:

  • 在保存方法中回滚
  • 或者让我们的两个模型同步的另一种方式

1 个答案:

答案 0 :(得分:0)

事实上,很简单:

只需用@ transaction.atomic

进行装饰
@transaction.atomic
def save(self, *args, **kwargs):

    super(MyModel, self).save(*args, **kwargs)

    try:
        self.sync_to_ldap()
    except:
        raise