【问题标题】:Django makemigrations KeyError: 'content_type'Django makemigrations KeyError:'content_type'
【发布时间】:2021-10-01 16:07:54
【问题描述】:

上次我在本地更改数据模型并尝试将其推送到生产环境并在那里迁移数据库时,我收到了来自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'

现在我无法向前或向后移动,并且卡在服务器上的当前数据模型中。 我可以以某种方式从生产服务器中删除所有旧迁移文件并从当前数据库中重新开始吗?

说实话,我不太确定错误是什么意思

很高兴提供更多信息,因为我也不知道从哪里开始。

【问题讨论】:

  • 您的回溯不是makemigrations 的输出,而是migrate 命令的输出。 (编辑问题以解决它。)您使用 Django。 3.1.x 用于生产。您是否也在 Django 3.1.x 上创建了迁移?你在生产中使用 MySQL 还是 PostgreSQL? Postgres 在 trasactions 中运行 manage,并且数据库在迁移失败之前保持一致的未更改状态。您似乎正在删除通用字段或 content_type 字段。

标签: django django-models django-migrations


【解决方案1】:

如果您在回溯中看到以下行

 pre_migrate_state = executor._create_project_state(...)

它甚至与数据库后端的类型(sqlite3 vs MySQL vs PostgreSQL)无关,而是与项目的代码有关。然后,您可以在另一个开发虚拟 Python 环境中安全地重现问题并解决问题,首先您可以从一个空数据库开始。也许所有代码都不完全相同(存储库未跟踪的文件?)或者迁移是在比生产上运行的更高版本的 Django 版本中创建的(例如 3.2.x 与 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 check”并运行“ manage.py makemigrations”。一个一个地应用其他有问题的更改,并在每次更改后运行检查和 makemigrations。在开发中向前和向后尝试这些迁移。由他们替换生产中有问题的未应用的大迁移。

【讨论】:

  • 非常感谢。您完全正确,错误与数据库无关。我在服务器上有一个迁移文件,它试图修改一个不在数据库中的字段,并且该文件不再被 git 跟踪。我已经手动删除了该迁移文件,因为本地版本没有它也可以正常工作,并且我在服务器上没有任何问题,并且所有迁移都正确应用。
猜你喜欢
  • 2017-10-28
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 2019-01-26
相关资源
最近更新 更多