我确实想保留一些有关已删除用户的信息(例如用户名)以在论坛帖子中显示。我怎样才能实现这一目标?
到目前为止我有这个:
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 早,因此哨兵用户还不存在。
最佳答案
如果您的最终目标是保存有关用户的数据,则django user docs建议使用 is_active
标志而不是删除用户。这样,您将保持对用户信息的访问,无需担心外键一致性,并且无需为删除的每个用户创建虚拟用户。
然后,您可以使用 on_delete=models.PROTECT
进行备份,以确保您仍然保护数据库的一致性。
如果由于某种原因您必须删除您的用户,我会覆盖 Post
上的 delete()
而不是尝试使用信号.
因此,示例解决方案可能类似于:
def delete(self):
self.created = SentinelUser.objects.get_or_create(username=self.created.username+" (left)")[0]
self.save()
return super(Post,self).delete(self)
关于Django 在删除时创建 "sentinel"用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42388112/