python - Django 数据库错误 : missing table social_auth_usersocialauth when social_auth is not installed

标签 python django tastypie

我正在尝试处理 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/

相关文章:

python - 使用 scipy.spatial.Delaunay 代替 matplotlib.tri.Triangulation 的内置版本

python - Django 错误 : "' ChoiceField' object has no attribute 'is_hidden' "

Django TastyPie 地理距离查找

mongodb - 使用 backbone.js 在模型中保存嵌套集合

python - MAXent分类器NLTK输出理解

python - 是否有 "get or default"访问列表的方式?

python - 如何使用 URL 的一部分预填充 Django 表单?

javascript - 将非 AMD 兼容的 javascript 模块与 require.js 一起使用?

python - 在Python中,我如何使用自定义键与多个值进行比较?

python - 无法在 AWS Elastic Beanstalk 上找到 Django 应用程序的模块