如何解决“ django_content_type已经存在”?


70

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

ProgrammingError: relation "django_content_type" already exists

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

Answers:


127

使用--fake-initial有时可能会在项目上进行初始迁移

python manage.py migrate --fake-initial

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

从文档中:

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

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


2
有什么方法可以manage.py migrate在现有数据库和新数据库上运行一个命令?
罗宾·温斯洛

2
@RobinWinslow如果您希望1个命令始终有效,则附加--fake-initial标志始终应有效。
Dan O'Boyle,2015年

23
在django 2.1中没有帮助。错误chnges到column "name" of relation "django_content_type" does not exist
亚历克斯·乔利格

1

我在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迁移--fake
  6. (virtualenv)python manage.py迁移
  7. (virtualenv)python manage.py collectstatic
  8. (virtualenv)python manage.py运行服务器0.0.0.0:8000

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.