我确实希望保留一些有关已删除用户(如用户名)的信息,以便在论坛帖子中显示。我怎样才能做到这一点?
到目前为止,我有这个:
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用户还不存在。
答案 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)