Django在删除

时间:2017-02-22 09:52:34

标签: django django-models django-admin

我确实希望保留一些有关已删除用户(如用户名)的信息,以便在论坛帖子中显示。我怎样才能做到这一点?

到目前为止,我有这个:

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

但是,如果我在Admin中使用它,它就不起作用,因为出于某种原因,get_sentinel_user比pre_delete更早运行,因此sentinel用户还不存在。

1 个答案:

答案 0 :(得分:1)

如果您的最终目标是保存有关用户的数据,django user docs建议使用is_active标记而不是删除用户。这样,您将保持对用户信息的访问权限,不需要担心您的ForeignKey一致性,也不会为您删除的每个用户创建虚拟用户。

然后,您可以使用on_delete=models.PROTECT进行备份,以确保仍然保护数据库的一致性。

如果由于某种原因您必须删除您的用户,我会覆盖delete()上的Post,而不是尝试使用信号。

因此,示例解决方案可能类似于:

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