我怎样才能解决'django_content_type已存在'?

Dan*_*yle 64 python django

升级到django 1.8后,我在迁移过程中收到错误消息:

ProgrammingError: relation "django_content_type" already exists
Run Code Online (Sandbox Code Playgroud)

我对这个错误背后的背景感兴趣,但更重要的是,我该如何解决它?

Dan*_*yle 120

使用--fake-initial有时会对项目的初始迁移造成麻烦

python manage.py migrate --fake-initial
Run Code Online (Sandbox Code Playgroud)

它是1.8的新功能.在1.7中, - fake-initial是一个隐式默认值,但在1.8中是显式的.

来自Docs:

如果所有具有该迁移中所有CreateModel操作创建的模型名称的数据库表已经存在,则可以使用--fake-initial选项允许Django跳过应用程序的初始迁移.此选项适用于首次针对预先存在使用迁移的数据库运行迁移时使用.但是,此选项不会检查匹配的表名称之外的匹配数据库模式,因此只有在您确信现有模式与初始迁移中记录的模式匹配时才可以安全使用.

https://docs.djangoproject.com/en/1.8/ref/django-admin/#django-admin-option---fake-initial

  • 在django 2.1中没有帮助.错误chnge到关系"django_content_type"的"列"名称"不存在` (12认同)
  • 有什么方法可以执行一个“manage.py migrate”命令,它可以同时适用于现有数据库和新数据库? (3认同)
  • 谢谢你这个信息就像一个魅力! (2认同)
  • @RobinWinslow如果你想要1个命令一致地工作,附加--fake-initial标志总是应该工作. (2认同)

San*_*ana 6

我在 Ubuntu 18.04 + Postgres 10.10 版本上托管的 Django 2.2.7 或 Django 3.0 上解决了这个问题。

  1. 在 Postgres 数据库中恢复数据库(为此使用了 pgAdmin 工具)
  2. (virtualenv)python manage.py loaddata dumpfile.json
  3. 从数据库中删除 django_migrations 表(为此使用 pgAdmin 工具)
  4. (virtualenv)python manage.py makemigrations
  5. (virtualenv)python manage.py migrate --fake
  6. (virtualenv)python manage.py migrate
  7. (virtualenv)python manage.py collectstatic
  8. (virtualenv)python manage.py runserver 0.0.0.0:8000