2013-12-12 32 views
0

我有一個模型,用戶,我需要在用戶保存後直接在數據庫中創建另一個模型實例,客戶端。 要做到這一點,我使用一個接收器,這樣的:·回滾post_save接收器中的事務?

@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) 

這工作在正常情況下,但如果由於某種原因,例如客戶端沒有保存,我需要回滾創造能力 的客戶。有沒有一種首選的方法來做到這一點?

+0

所以你有3個模型 - 客戶,用戶和客戶? – professorDante

+0

沒有。只是用戶和客戶端,更新反映,對不起 – user1427661

回答

0

通過回滾整個交易。直接從文檔摘自:

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(),你的情況用戶保存。

+0

我沒有訪問post_save接收器方法 – user1427661

+0

只是導入它的django.db導入事務,IntegrityError的交易對象。它是數據庫事務中的一個API。只是不確定它是否計爲2筆交易,因爲您使用的是信號。我認爲你使用的是信號,因爲在你創建一個用戶的代碼庫中有多個地方? – professorDante

+0

不,因爲我需要在用戶保存後創建客戶端,所以post_save看起來是最有效的選擇。 – user1427661