创建新内容类型时出错。请确保在尝试单独迁移应用程序之前迁移内容类型
Posted
技术标签:
【中文标题】创建新内容类型时出错。请确保在尝试单独迁移应用程序之前迁移内容类型【英文标题】:Error creating new content types. Please make sure contenttypes is migrated before trying to migrate apps individually 【发布时间】:2015-07-07 04:29:22 【问题描述】:我正在尝试从 Django 1.6
迁移到 Django 1.8
。我在 Django 1.6 中使用South
管理migrations
。我已经通过python manage.py makemigrations
成功创建了新的迁移文件。在运行python manage.py migrate --fake-initial
时,出现此错误
Traceback (most recent call last):
File "manage.py", line 39, in <module>
execute_from_command_line(sys.argv)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site- packages/django/core/management/__init__.py", line 338, in execute_from_command_line
utility.execute()
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site- packages/django/core/management/__init__.py", line 330, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/core/management/base.py", line 390, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/core/management/base.py", line 441, in execute
output = self.handle(*args, **options)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 225, in handle
emit_post_migrate_signal(created_models, self.verbosity, self.interactive, connection.alias)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/core/management/sql.py", line 280, in emit_post_migrate_signal
using=db)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/dispatch/dispatcher.py", line 201, in send
response = receiver(signal=self, sender=sender, **named)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/contrib/auth/management/__init__.py", line 82, in create_permissions
ctype = ContentType.objects.db_manager(using).get_for_model(klass)
File "/home/jonty/.virtualenvs/squadrun/local/lib/python2.7/site-packages/django/contrib/contenttypes/models.py", line 78, in get_for_model
"Error creating new content types. Please make sure contenttypes "
其中一个迁移文件0001_initial.py
说:
dependencies = [
('auth', '0006_require_contenttypes_0002'),
('clients', '0002_auto_20150428_1551'),
('players', '0001_initial'),
]
我猜这尤其是问题所在。有什么办法可以解决这个问题。任何帮助将不胜感激。
【问题讨论】:
对 auth 0006 的依赖应确保在运行后迁移信号之前迁移contenttypes
。如果手动运行ContentType.objects.get(app_label=<app label>, model_name=<model name>)
会出现什么错误?
ContentType matching query does not exist
和get_or_create()
?
【参考方案1】:
根据this,我认为这与“删除ContentType.name
”有关。但不知何故,它不起作用。
通过手动从“django_content_type”表中删除列name
。例如。
'ALTER TABLE django_content_type DROP COLUMN name'
我能够应用迁移。也许这至少能让你走得更远。
【讨论】:
我能够通过完全删除表django_content_type
并运行迁移来完成这项工作。是的,这是因为 name
已在 Django 1.8
中删除。
另一种选择,创建一个临时数据库,做一个syncdb等,然后将django_content_type表复制到问题数据库中。
Django 1.8 中有django/contrib/contenttypes/migrations/0002_remove_content_type_name.py
。没有检查什么时候添加的。
@Shubham 有趣的是,我也放下了桌子,但错误仍然存在。 :/
【参考方案2】:
尝试先迁移身份验证应用程序,然后再迁移其他应用程序:
manage.py migrate auth
manage.py migrate <app_name>
【讨论】:
@Stryker 我很高兴听到这个消息 :)【参考方案3】:就我而言,我解决这个问题的方法是更新到更新版本的 django。 如果您使用 mac,请执行以下操作:
-
pip install django --upgrade
python manage.py makemigrations
python manage.py 迁移
【讨论】:
【参考方案4】:可能看起来很奇怪,但我通过升级到 Django 1.8 版解决了这个问题。 最初我使用的是 1.7 版
【讨论】:
升级到新版本确实解决了我的问题。谢谢!【参考方案5】:添加到@int_ua 的评论 将此作为依赖项添加到失败的迁移中:
dependencies = [
('contenttypes', '0002_remove_content_type_name'),
]
然后再次运行迁移。
【讨论】:
【参考方案6】:我不得不在 Django 1.9.1 中合并两个系统,但我无法克服这个错误:
"Error creating new content types. Please make sure contenttypes "
广泛的谷歌搜索和堆栈溢出没有结果。最后,我将调试行添加到
~/.virtualenvs/(venv_name)/lib/python2.7/site-packages/django/contrib/contenttypes/models.py
except (OperationalError, ProgrammingError, IntegrityError):
# It's possible to migrate a single app before contenttypes,
# as it's not a required initial dependency (it's contrib!)
# Have a nice error for this.
print "\n\nError for Content type model "+opts.model_name+"\n\n"
raise RuntimeError(
"Error creating new content types. Please make sure contenttypes "
"is migrated before trying to migrate apps individually."
)
这告诉了我导致错误并最终导致修复的型号名称。
我正在使用 Postgres,表 django_content_type 和 auth_permission 的序列号没有指向表的末尾,导致插入失败。
这两行修复了(基于此SO post)
SELECT pg_catalog.setval(pg_get_serial_sequence('django_content_type', 'id'), (SELECT MAX(id) FROM django_content_type)+1);
SELECT pg_catalog.setval(pg_get_serial_sequence('auth_permission', 'id'), (SELECT MAX(id) FROM auth_permission)+1);
【讨论】:
以上是关于创建新内容类型时出错。请确保在尝试单独迁移应用程序之前迁移内容类型的主要内容,如果未能解决你的问题,请参考以下文章
Python Django 1.9 迁移错误“创建新内容类型时出错...”