Django 1.8 迁移:django_content_type 不存在

Posted

技术标签:

【中文标题】Django 1.8 迁移:django_content_type 不存在【英文标题】:Django 1.8 migrate: django_content_type does not exist 【发布时间】:2015-12-13 18:25:51 【问题描述】:

我刚刚将我的 django 从 1.7.1 升级到 1.8.4。我尝试运行python manage.py migrate,但出现此错误:

django.db.utils.ProgrammingError: relation "django_content_type" does not exist

我删除了我的数据库,创建了一个新数据库,然后再次运行该命令。但我得到同样的错误。我错过了什么吗?我需要做些什么来升级我的 django 吗?

编辑: 我降级回 1.7.1 并且可以正常工作。有没有办法为 1.8.4 修复它?

【问题讨论】:

【参考方案1】:

尝试先迁移contenttypes,然后迁移 Django 包含的其余模型,然后是您自己的模型:

./manage.py migrate contenttypes
./manage.py migrate
./manage.py makemigrations <YOUR APP>
./manage.py migrate --fake

【讨论】:

【参考方案2】:

我已经删除了数据库并重建了它,然后在 PyCharm 终端 py manage.py makemigrationspy manage.py migrate 中修复了这个问题。我认为原因是表django_content_type是django的表,如果错过不能迁移,所以不得不drop数据库并重建。

【讨论】:

> 删除数据库:-D【参考方案3】:

在尝试从头开始迁移我们的模型时(尤其是在测试构建时),我遇到了同样的问题。经过进一步调查,我们发现与ContentTypes 模型相关的自定义代码与django_content_type 表相关联:

staff_content_types = ContentType.objects.filter(model__in=ACCOUNT_STAFF_APPS)

然后,在我们将访问staff_content_types 变量的后续代码中,它将抛出django.db.utils.ProgrammingError: Table 'django_content_type' doesn't exist 消息。显然,它试图访问尚未构建的django_content_type 表。我们的代码基于我们的数据已经设置好的上下文。

因此,至少有 2 种可能的解决方法。我们的想法是仅在我们的站点已有数据时(在迁移阶段之后)运行我们自定义的 ContentType 相关逻辑:

    捕获迁移过程中发生的错误并忽略它:

    from django.db.utils import ProgrammingError
    
    try:
        for content_type in staff_content_types:
            # Our custom codes here.
    except ProgrammingError:
        pass
    

    仅当django_content_type 表存在(即迁移后的状态)时才继续:

    from django.db import connection
    
    if 'django_content_type' in connection.introspection.table_names():
        for content_type in staff_content_types:
            # Our custom codes here.
    

同样,使用 Django ContentType objects/table 的第 3 方应用程序可能存在类似问题。因此,您要么禁用它们,要么要求它们的作者根据此处建议的想法修补他们的贡献应用程序。

【讨论】:

这是极好的解决方案。谢谢!【参考方案4】:

这是我发现/所做的。我正在使用 django 1.8.13 和 python 2.7。 Sqlite 没有出现此问题。它确实发生在 PostgreSQL 上。

我有一个使用 GenericForeignKey(依赖于 Contenttypes)的应用程序。我有另一个应用程序,它的模型通过 GenericForeignKey 链接到第一个应用程序。如果我为这两个应用程序运行 makemigrations,那么 migrate 工作。

【讨论】:

【参考方案5】:

好吧,我找到了问题所在。我安装了auditlog 作为我的应用程序之一。我删除了它并且迁移工作正常。

【讨论】:

你好,这个问题你是怎么详细解决的?我面临与你完全相同的问题,但不知道auditlog 在这里是什么意思。非常感谢! @JasonZhu auditlog 是我的项目中安装的一个外部 django 应用程序。我不记得为什么它搞砸了迁移,但是在我从我的设置中删除它之后,迁移再次起作用。请记住,由于特定的 django 应用程序,我的问题得到了解决,因此您的项目可能是一个完全不同的故事。 好的!无论如何感谢您的回复,最后我发现我的问题与用户的 postgres 数据库权限有关:)【参考方案6】:

从您的应用程序中删除所有迁移文件夹并删除数据库然后迁移您的数据库......

如果这不起作用,请从数据库中删除 django_migration 表并在 django_content_type 表 ALTER TABLE django_content_type ADD COLUMN name character varying(50) NOT NULL DEFAULT 'anyName'; 中添加“名称”列,然后运行 ​​$ python manage.py migrate --fake-initial

【讨论】:

以上是关于Django 1.8 迁移:django_content_type 不存在的主要内容,如果未能解决你的问题,请参考以下文章

无法将 Django 从 1.7 迁移到 1.8

django 1.8 测试模型和迁移

postgres 的 Django 1.8 迁移错误

Django 1.8 迁移无法将列 ID 转换为整数

Django 1.8:删除迁移文件夹后未检测到迁移

将旧 (Django 0.97) 模型数据导入/迁移到 Django 1.8 或更高版本