Django 1.8迁移:django_content_type不存在

时间:2015-09-17 00:45:54

标签: django python-2.7 django-1.7 django-migrations django-1.8

我刚刚将我的django从1.7.1升级到1.8.4。我试图运行django.db.utils.ProgrammingError: relation "django_content_type" does not exist但是我收到了这个错误:

{{1}}

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

编辑: 我将其降级回1.7.1并且有效。有没有办法解决它1.8.4?

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

好吧,我发现了这个问题。我已将auditlog安装为我的应用程序。我删除了它,迁移工作正常。

答案 2 :(得分:1)

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

我有一个使用GenericForeignKey的应用程序(依赖于Contenttypes)。我有另一个应用程序,其模型通过GenericForeignKey链接到第一个应用程序。如果我为这两个应用程序运行makemigrations,那么迁移就可以了。

答案 3 :(得分:0)

尝试从头开始迁移我们的模型时遇到了同样的问题(特别是在测试版本时)。经过进一步调查,我们发现我们有与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相关逻辑:

  1. 抓住迁移过程中发生的错误并忽略它:

    from django.db.utils import ProgrammingError
    
    try:
        for content_type in staff_content_types:
            # Our custom codes here.
    except ProgrammingError:
        pass
    
  2. 仅在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.
    
  3. 同样,使用Django ContentType对象/表的第三方应用程序可能会遇到类似的问题。因此,要么禁用它们,要么要求其作者使用此处建议的想法修补其贡献应用程序。

答案 4 :(得分:0)

我删除了数据库并重建了它,然后在 PyCharm 终端 py manage.py makemigrationspy manage.py migrate 中修复了这个问题。我想原因是django_content_type这个表是django的表,如果漏掉了就不能迁移,只好删除数据库重建。