2017-02-22 45 views
1

我確實希望保留一些關於刪除用戶(如用戶名)的信息以顯示在論壇帖子中。我怎樣才能做到這一點?Django在刪除時創建「哨兵」用戶

到目前爲止,我有這樣的:

class Post(models.Model): 
    (...) 
    creator = models.ForeignKey(User, blank=True, null=True,on_delete=models.SET(get_sentinel_user)) 

@receiver(pre_delete, sender=User, dispatch_uid='user_delete_signal') 
def create_sentinel_user(sender, instance, using, **kwargs): 
    SentinelUser.objects.get_or_create(\ 
    username=instance.username+" (left)")[0] 

def get_sentinel_user(): 
    return SentinelUser.objects.latest('id') 

但是如果我使用,在管理,它不因爲某些原因get_sentinel_user工作比pre_delete更快運行,併爲此定點用戶尚不存在。

+0

其一,你是做在得到create_sentinel_user和SentinelUser SentinelUsers。 – Fred

+0

我意識到這一點。這是因爲我不能從模型on_delete函數調用中傳遞參數,所以我必須將它們分開。 – Stefan

+0

我現在看到,這是一個錯字。該操作運行正常,但沒有錯誤。固定。 – Stefan

回答

1

如果您的最終目標是保存有關用戶的數據,django user docs建議使用is_active標誌而不是刪除用戶。這樣,您將保持對用戶信息的訪問權限,不需要擔心您的ForeignKey一致性,也不需要爲刪除的每個用戶創建虛擬用戶。

然後,您可以使用on_delete=models.PROTECT來確保您仍然保護數據庫的一致性。

如果由於某種原因,你必須刪除您的用戶,我會覆蓋上Postdelete(),而不是試圖用信號。

因此,樣品溶液可能是這樣的:

def delete(self): 
    self.created = SentinelUser.objects.get_or_create(username=self.created.username+" (left)")[0] 
    self.save() 
    return super(Post,self).delete(self)