代码之家  ›  专栏  ›  技术社区  ›  AliBZ

Django 1.8迁移:Django_content_type不存在

  •  6
  • AliBZ  · 技术社区  · 9 年前

    我刚将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的问题?

    6 回复  |  直到 9 年前
        1
  •  6
  •   Ashok Joshi    9 年前

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

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

        2
  •  2
  •   Chuck    8 年前

    这是我发现/做的。我使用的是django 1.8.13和python 2.7。Sqlite没有出现问题。PostgreSQL确实发生了这种情况。

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

        3
  •  2
  •   Ranel Padon    7 年前

    我在尝试从零开始迁移模型时也遇到了同样的问题(尤其是在测试构建时)。经过进一步调查,发现我们有与 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 表尚未构建。我们的代码基于数据已经设置的上下文。

    因此,至少有两种可能的变通方法。我们的想法是,只有当我们的站点已经有数据时(在迁移阶段之后),才运行我们的自定义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.
      

    同样,使用Django的第三方应用程序 ContentType 对象/表可能有类似的问题。所以,你要么禁用它们,要么要求它们的作者按照这里的建议修补它们的contrib应用程序。

        4
  •  1
  •   AliBZ    9 年前

    我发现了问题。我有 auditlog 作为我的应用之一安装。我删除了它,迁移工作正常。

        5
  •  0
  •   WoodPecker    3 年前

    我删除了数据库并重建了它,然后在PyCharm终端 py manage.py makemigrations py manage.py migrate 解决此问题。我认为原因是表django_content_type是django的表,如果它错了就不能迁移,所以必须删除数据库并重建。

        6
  •  0
  •   Roger Dahl    3 年前

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

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