无法在 django 的内置身份验证应用程序中删除用户

Posted

技术标签:

【中文标题】无法在 django 的内置身份验证应用程序中删除用户【英文标题】:Unable to delete a user in django's built in auth app 【发布时间】:2021-09-01 23:22:32 【问题描述】:

当我尝试从 Django 的内置身份验证应用程序中删除用户时,出现以下错误: django.db.utils.OperationalError: no such table: main.auth_user__old

我在网上搜索,发现了这个问题:Django - No such table: main.auth_user__old 所以我更新了 Django,我现在使用的是 3.2.4 版本(我使用的是 sqlite)。然后我尝试从数据库中删除身份验证表,但是当我执行ptyhon manage.py makemigrations auth 时,它告诉我没有检测到任何更改。 另外,我不能删除整个数据库。

有人知道我可以做些什么来解决这个问题吗?

【问题讨论】:

你跑python manage.py migrate了吗? 尝试python manage.py migrate auth zero --fake,然后尝试python manage.py migrate。你真的不应该自己去删除表,迁移系统可以很容易地做到这一点。 谢谢@AbdulAzizBarkat,它成功了!但是,您的命令并没有自动删除这些表,我不得不手动再次删除。它与'--fake'标签有关吗? 我以为您已经删除了表格?这就是我在命令中包含--fake 的原因。 是的,我已经删除了它们,但是因为没有任何效果,我恢复了旧版本的数据库以尝试其他方法。 【参考方案1】:

您不应该在使用 Django 时手动删除表。 Django 向数据库中添加了一个名为django_migrations 的额外表,在此表中,Django 跟踪应用了哪些迁移。当您手动删除内容时,他们的条目仍然留在此表中,因此您发现自己无法应用迁移。

做你想做的最简单的方法是通过指定迁移名称迁移到以前的迁移来反转迁移:

python manage.py [app_label] [migration_name]

您可以使用zero 作为migration_name 来逆转所有 迁移。如果假设您已经手动更改了内容,则可以使用 --fake 标志来伪造迁移(这将简单地将迁移标记/取消标记为已应用)。考虑到您已经删除了表,您可以使用以下命令:

python manage.py migrate auth zero --fake

有关migrate 命令的更多信息,您可以阅读documentation。

【讨论】:

以上是关于无法在 django 的内置身份验证应用程序中删除用户的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django中为SQLServer数据库创建身份验证系统?

带有内置登录视图和身份验证表单的 Django “记住我”

Django-为啥内置身份验证登录功能在成功登录网址后未将有关用户的信息传递给

如何将 Django 的内置身份验证与自定义表单(html 模板)一起使用

如何在身份验证和授权的 Django Admin 部分更改权限框的大小?

Django 基于类的通用视图和身份验证