我正在尝试处理 Django 应用程序中一个非常令人费解的错误。当 DEBUG=False 时,尝试删除用户(通过 user.delete()
)会出现此数据库错误:
DatabaseError: relation "social_auth_usersocialauth" does not exist
LINE 1: ...", "social_auth_usersocialauth"."extra_data" FROM "social_au...
但是,我在 INSTALLED_APPS 中没有 social_auth 或类似名称的任何东西,我的数据库中也没有任何此类表,我的任何代码也没有引用任何此类内容(我在“社交”上运行了文本搜索在整个项目文件夹中)——同样,当 DEBUG=True 时,这工作正常。 social_auth 安装在我的系统和我的 PYTHONPATH 上,但我看不出这个应用程序从哪里得到它应该在其数据库中包含 social_auth 表的想法,更不用说为什么它只在 DEBUG=False 时才这么认为。
我的应用可以通过哪些可能的途径获取此表,我如何才能说服它它不应该存在?
最佳答案
问题可能是由Django content types 实现的保存通用关系 引起的. Django 中的关系不仅是静态的,由模型和 INSTALLED_APPS
实现,而且是由表 django_content_type
实现的动态关系,它保存了从数字 id 到 app_label + 模型的映射。可能的动态关系的一个例子是许可或评论。您可以拥有或不拥有任何已安装应用程序的任何表的权限。您可以在不更改任何模型的情况下对所有内容(例如文章)、用户对评论本身进行评论。这种关系是通过保存与该模型(表)相关的 ContentType 的数字 ID 和相关对象(行)的主键来实现的。
Django 并不期望有人可以手动操作数据库。如果你使用 south对于操作,如果您在卸载应用程序后运行 syncdb
,south 会询问您是否要自动删除孤立的内容类型。然后可以安全地删除未使用的表,而不会在以后被引用。
(可能的黑客攻击:从 django_content_type 中删除 app_label='social_auth'
但 south
是可靠的。)
问题的许多部分仍然悬而未决。
编辑:
为什么这不是正确的方法:所有通用关系都是从后代到父代,并且所有关于该关系的数据都保存在后代中。如果从 INSTALLED_APPS 中删除了子应用程序,那么 django.db 代码将永远无法尝试删除后代,因为它无法识别哪些列包含关系数据。
关于python - Django 数据库错误 : missing table social_auth_usersocialauth when social_auth is not installed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13360251/