在post_save接收器中回滚事务?

时间:2013-12-12 17:35:40

标签: python django

我有一个模型,用户,我需要在保存用户后直接在数据库中创建模型的另一个实例Client。 要做到这一点,我正在使用接收器,如下所示:·

@receiver(models.signals.post_save, sender=User)
def create_oauth_client(sender, **kwargs):
    if kwargs['created']:
                Client.objects.create(user=kwargs['instance'], name="Customer OAuth Client", client_type=1)

这适用于正常情况,但如果由于某种原因未保存客户端实例,我需要能够回滚创建 客户。有没有一种首选的方法呢?

1 个答案:

答案 0 :(得分:1)

通过回滚整个交易。直接来自文档:

a.save() # Succeeds, but may be undone by transaction rollback
try:
    b.save() # Could throw exception
except IntegrityError:
    transaction.rollback()
c.save() # Succeeds, but a.save() may have been undone

换句话说,如果b.save()失败,在你的情况下,保存客户端,回滚整个事情,包括a.save(),在你的情况下用户保存。