Django 在删除时创建 "sentinel"用户

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

但是,如果我在管理中使用它,它不起作用,因为由于某种原因 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/

相关文章:

django - sorl-thumbnail:在保存前调整原始图像的大小?

python - 通过带内联的 Django ModelAdmin 在管理门户中显示与 "self"的两个关系

jquery - 如何从通过ajax调用接收到的json数组动态生成html列表?

django - 如果在 Django(使用 PostgreSQL 数据库)中超过 5 分钟(否则为 0),则以秒为单位获取记录的年龄

python - 如何更改字段的顺序?

Django 将外键限制为满足特定条件的记录

python - 仅限 Django 管理静态文件 -> 404

python - 如何编写基于类的 Django 验证器?

django-models - 同一个表DJANGO的中间表中有多个外键

python - Django 查询查找具有大于零的特定值的行数,按用户分组