Django makemigrations KeyError: 'content_type'
Django makemigrations KeyError: 'content_type'
上次我在本地更改数据模型并尝试将其推送到生产环境并在那里迁移数据库,我从 makemigrations
命令得到以下响应:
Traceback (most recent call last):
File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/base.py", line 371, in execute
output = self.handle(*args, **options)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/base.py", line 85, in wrapped
res = handle_func(*args, **kwargs)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 201, in handle
pre_migrate_state = executor._create_project_state(with_applied_migrations=True)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/db/migrations/executor.py", line 79, in _create_project_state
migration.mutate_state(state, preserve=False)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/db/migrations/migration.py", line 87, in mutate_state
operation.state_forwards(self.app_label, new_state)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/db/migrations/operations/fields.py", line 158, in state_forwards
old_field = model_state.fields.pop(self.name)
KeyError: 'content_type'
现在我无法向前或向后移动,并且受困于服务器上的当前数据模型。
我能否以某种方式从生产服务器中删除所有旧迁移文件并从当前数据库重新开始清理?
老实说,我不太确定错误是什么意思
很高兴提供更多信息,因为我也不知道从哪里开始。
问题与数据库无关
如果您在回溯中看到以下行
pre_migrate_state = executor._create_project_state(...)
甚至与数据库后端的类型无关(sqlite3 vs MySQL vs PostgreSQL),而是与项目的代码有关。然后您可以重现问题并首先在另一个开发虚拟 Python 环境中安全地解决问题,您可以从一个空数据库开始。也许所有代码都不完全相同(存储库未跟踪文件?)或者迁移是在比生产中 运行ning 更高的 Django 版本中创建的(例如 3.2.x vs. 3 .1.x) 或 INSTALLED_APPS 不同,或者您过早删除了某些迁移仍在使用的未使用代码部分。
迁移的一般故障排除:
运行 命令 python manage.py showmigrations
到 查看所有未应用的迁移 。 (您也可以将它与开发机器上的相同列表进行比较。这可能会发现例如不兼容的配置。)
运行一个命令python manage.py migrate --plan
看一个简单的信息是什么第一次失败未应用迁移的内容。读第一行。示例:
Planned operations:
example.0003_auto_20210714_2108
Add field foo_field to my_model
Add field bar_field to my_model
通过某些数据库管理应用程序验证第一个命令尚未应用(例如,未添加“foo_field”)以确保数据库状态仍然一致.
将开发机器上有问题的迁移拆分为两个或更多较小的迁移:
删除迁移文件(将其移动到某个备份)
猜猜有问题的更改是什么,这很简单。 (在你的情况下,它正在删除一个字段“content_type”,或者删除一个使用 content_type 的 GenericForeignKey,也许还有它使用的东西。)恢复 models.py 中所有有问题的更改, 运行 “manage.py 检查”和 运行 “manage.py makemigrations”。一项一项应用其他有问题的更改,并 运行 检查并在每次更改后进行迁移。在开发中尝试这些向前和向后的迁移。把生产中有问题的未应用的大迁移替换成他们
上次我在本地更改数据模型并尝试将其推送到生产环境并在那里迁移数据库,我从 makemigrations
命令得到以下响应:
Traceback (most recent call last):
File "manage.py", line 15, in <module>
execute_from_command_line(sys.argv)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
utility.execute()
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/__init__.py", line 395, in execute
self.fetch_command(subcommand).run_from_argv(self.argv)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/base.py", line 330, in run_from_argv
self.execute(*args, **cmd_options)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/base.py", line 371, in execute
output = self.handle(*args, **options)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/base.py", line 85, in wrapped
res = handle_func(*args, **kwargs)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 201, in handle
pre_migrate_state = executor._create_project_state(with_applied_migrations=True)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/db/migrations/executor.py", line 79, in _create_project_state
migration.mutate_state(state, preserve=False)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/db/migrations/migration.py", line 87, in mutate_state
operation.state_forwards(self.app_label, new_state)
File "/home/JoshuaMSchmidt/.virtualenvs/env/lib/python3.7/site-packages/django/db/migrations/operations/fields.py", line 158, in state_forwards
old_field = model_state.fields.pop(self.name)
KeyError: 'content_type'
现在我无法向前或向后移动,并且受困于服务器上的当前数据模型。 我能否以某种方式从生产服务器中删除所有旧迁移文件并从当前数据库重新开始清理?
老实说,我不太确定错误是什么意思
很高兴提供更多信息,因为我也不知道从哪里开始。
问题与数据库无关
如果您在回溯中看到以下行
pre_migrate_state = executor._create_project_state(...)
甚至与数据库后端的类型无关(sqlite3 vs MySQL vs PostgreSQL),而是与项目的代码有关。然后您可以重现问题并首先在另一个开发虚拟 Python 环境中安全地解决问题,您可以从一个空数据库开始。也许所有代码都不完全相同(存储库未跟踪文件?)或者迁移是在比生产中 运行ning 更高的 Django 版本中创建的(例如 3.2.x vs. 3 .1.x) 或 INSTALLED_APPS 不同,或者您过早删除了某些迁移仍在使用的未使用代码部分。
迁移的一般故障排除:
运行 命令 python manage.py showmigrations
到 查看所有未应用的迁移 。 (您也可以将它与开发机器上的相同列表进行比较。这可能会发现例如不兼容的配置。)
运行一个命令python manage.py migrate --plan
看一个简单的信息是什么第一次失败未应用迁移的内容。读第一行。示例:
Planned operations:
example.0003_auto_20210714_2108
Add field foo_field to my_model
Add field bar_field to my_model
通过某些数据库管理应用程序验证第一个命令尚未应用(例如,未添加“foo_field”)以确保数据库状态仍然一致.
将开发机器上有问题的迁移拆分为两个或更多较小的迁移:
删除迁移文件(将其移动到某个备份)
猜猜有问题的更改是什么,这很简单。 (在你的情况下,它正在删除一个字段“content_type”,或者删除一个使用 content_type 的 GenericForeignKey,也许还有它使用的东西。)恢复 models.py 中所有有问题的更改, 运行 “manage.py 检查”和 运行 “manage.py makemigrations”。一项一项应用其他有问题的更改,并 运行 检查并在每次更改后进行迁移。在开发中尝试这些向前和向后的迁移。把生产中有问题的未应用的大迁移替换成他们