Django 迁移错误 KeyError: ('list', u'user')

Posted

技术标签:

【中文标题】Django 迁移错误 KeyError: (\'list\', u\'user\')【英文标题】:Django migrations error KeyError: ('list', u'user')Django 迁移错误 KeyError: ('list', u'user') 【发布时间】:2016-04-25 07:04:00 【问题描述】:

我正在尝试运行

python manage.py migrate

python manage.py makemigrations

我收到了这个错误:

Running migrations:
  No migrations to apply.
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/rostunov/temp/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 353, in execute_from_command_line
    utility.execute()
  File "/Users/rostunov/temp/venv/lib/python2.7/site-packages/django/core/management/__init__.py", line 345, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/rostunov/temp/venv/lib/python2.7/site-packages/django/core/management/base.py", line 348, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/rostunov/temp/venv/lib/python2.7/site-packages/django/core/management/base.py", line 399, in execute
    output = self.handle(*args, **options)
  File "/Users/rostunov/temp/venv/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 183, in handle
    executor.loader.project_state(),
  File "/Users/rostunov/temp/venv/lib/python2.7/site-packages/django/db/migrations/loader.py", line 338, in project_state
    return self.graph.make_state(nodes=nodes, at_end=at_end, real_apps=list(self.unmigrated_apps))
  File "/Users/rostunov/temp/venv/lib/python2.7/site-packages/django/db/migrations/graph.py", line 280, in make_state
    project_state = self.nodes[node].mutate_state(project_state, preserve=False)
  File "/Users/rostunov/temp/venv/lib/python2.7/site-packages/django/db/migrations/migration.py", line 88, in mutate_state
    operation.state_forwards(self.app_label, new_state)
  File "/Users/rostunov/temp/venv/lib/python2.7/site-packages/django/db/migrations/operations/models.py", line 547, in state_forwards
    model_state = state.models[app_label, self.name_lower]
KeyError: ('list', u'user')

这发生在我从 git 中提取了我的应用程序的另一个版本之后。

我没有在另一台机器上使用相同的代码出现此错误。 我曾尝试将--fakezerosquashmigrations 一起使用,但这也无济于事。

不知道怎么解决。

【问题讨论】:

不要试图伪造或压制任何东西。这是一个问题,您需要解决它。否则,您将冒着引入数据库架构不一致的风险,这些不一致会在以后咬住您。您要尝试的第一件事是运行 python manage.py migrate -v 3 以便您可以查看哪个单独的迁移导致错误。执行此操作后,您可能希望包含正在迁移的模型和迁移代码。 【参考方案1】:

我遇到了类似的问题,db\migrations\operations\models.py 在通过 PyCharm 的重构(重命名)重命名模型后抛出了 KeyError

显然重构也发生在迁移文件中。打开迁移文件并改回原来的命名时,makemigrations 命令运行良好。

【讨论】:

我也有同样的问题。并在迁移文件中找到重构的类,然后将其重命名为原始名称解决了我的问题。 任何使用未设置的 ide 来忽略重构中的迁移文件的人最有可能遇到此问题。好收获!【参考方案2】:

问题出在迁移文件中。 当我以某种方式向 git 提交时,我删除了其中一个迁移文件,所以顺序就像 0001 0003 0004 没有 0002。 在第二个迁移文件中,我创建了一个名为 user 的模型。

问题是当我运行python manage.py migrate django 时找不到创建名为user 的模型的位置(该模型已在0002 文件中创建)。

我通过手动将此代码添加到0001 迁移文件来解决它:

migrations.CreateModel(
        name='user',
        fields=[
            (...necessary fields...),
        ],
        options=
            'ordering': ('title',),
        ,
    ),

【讨论】:

【参考方案3】:

我有同样的问题,发现最简单的解决方案,如果你的 models.py 是完整的,就是删除所有旧的迁移文件,然后再次运行 makemigrations。我不认为 squashmigrations 会有所帮助,因为它只会将所有不同的迁移文件合并为一个,并且它会在当前迁移文件的基础上进行迁移。如果您的迁移文件以某种方式损坏,这将无济于事。首先是什么导致了这个问题。

【讨论】:

非常有用!很好的解决方案! 帮了大忙 我找到了一种方法来做到这一点,而无需核对所有内容并使您的数据库同步。【参考方案4】:

我找到了导致此问题的原因及其解决方案。如果您有一个具有“替换”属性的压缩迁移,请删除“替换”中引用 django_migrations 表中缺少的迁移的元组。这解决了它。

【讨论】:

【参考方案5】:

我知道这是一个老问题。但如果有任何到达谷歌搜索:

在我的特殊情况下,我在重命名模型并同时修改其元数据(例如,重命名模型及其详细名称)后出现该错误

为了修复它,我修改了上次迁移,删除(或注释)与元数据更改相关的行,然后再次运行迁移命令。之后,再次运行 makemigrations/migrate 命令来更新数据库中的元数据

我正在使用 Django 2.0 和 PostgreSQL 9.6

希望您已经修复它。 JGED

编辑:PostgreSQL 版本

【讨论】:

同样的问题:Django 2.2 和 PostgreSQL 9.6。由于我的迁移从未完成,我只是将其删除并恢复了我的模型更改。然后我进行了名称更改、迁移,然后更新了详细名称并迁移了这些名称。 酷。 Django 迁移不是“防弹”。太好了,它对你有用@JoshuaHunter【参考方案6】:

如果你不太在意历史的丢失,你可以去你的应用的migrations目录,删除那里的所有文件。然后makemigrationsmigrate。它不会导致数据丢失,但可能会导致以后出现问题。

【讨论】:

【参考方案7】:

我会说@ceasaro的话,我的评论是关于这个answer。

较新版本的 Django 可以检测更改并询问已完成的操作。 我还要补充一点,Django 可能会混合一些迁移命令的执行顺序。

明智的做法是应用小的更改并运行makemigrationsmigrate,如果发生错误,可以编辑迁移文件。

可以更改某些行的执行顺序以避免错误。

【讨论】:

【参考方案8】:

我遇到了类似的问题,但是,我无法在迁移文件中确定问题的根源。也没有任何丢失的迁移文件。可能我看的不够仔细。

但是,当我'squashmigrations' 解决了这个问题。我在这里回复只是为了让访问此页面的任何人也可以尝试此解决方案。

【讨论】:

【参考方案9】:

将我们的项目移动到 python3 我遇到了类似的问题,这在 python 2.7 中没有发生,当使用 python3 运行时,这是我的输出:

Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/Users/silberringe/dms3/lib/python3.7/site-packages/django/core/management/__init__.py", line 364, in execute_from_command_line
    utility.execute()
  File "/Users/silberringe/dms3/lib/python3.7/site-packages/django/core/management/__init__.py", line 356, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/Users/silberringe/dms3/lib/python3.7/site-packages/django/core/management/base.py", line 283, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/Users/silberringe/dms3/lib/python3.7/site-packages/django/core/management/base.py", line 330, in execute
    output = self.handle(*args, **options)
  File "/Users/silberringe/dms3/lib/python3.7/site-packages/django/core/management/commands/migrate.py", line 163, in handle
    pre_migrate_state = executor._create_project_state(with_applied_migrations=True)
  File "/Users/silberringe/dms3/lib/python3.7/site-packages/django/db/migrations/executor.py", line 81, in _create_project_state
    migration.mutate_state(state, preserve=False)
  File "/Users/silberringe/dms3/lib/python3.7/site-packages/django/db/migrations/migration.py", line 92, in mutate_state
    operation.state_forwards(self.app_label, new_state)
  File "/Users/silberringe/dms3/lib/python3.7/site-packages/django/db/migrations/operations/fields.py", line 201, in state_forwards
    state.models[app_label, self.model_name_lower].fields
KeyError: ('finder_app', 'listing')

如您所见,即使使用-v 3,我什至没有收到导致问题的文件,即使使用--fake 也不起作用。

我最终注释掉了 finder_app 中的每个迁移文件,然后取消注释,直到错误发生变化。此时我知道是哪个文件导致了问题,我有一个名为 0005_similarmake_squashed_0024_unspecified_color.py 的压缩迁移文件,它压缩了 0024 和 0005。

查看文件中的dependencies,我发现它依赖于 0004,并将其更改为依赖于 0024。现在一切正常!

【讨论】:

【参考方案10】:

嘿,当我将版本从 Django 1.11 迁移到 3.2.4 到最新版本时遇到了同样的问题

在做 python manage.py migrate 我遇到了同样的问题 KeyError on doing migrate

我在互联网上搜索并没有找到任何东西,所以我尝试调试根目录 出现问题的模块中的函数 lib/python3.8/site-packages/django/db/migrations/operations/fields.py",第 167 行,在 state_forwards 中

这是我在迁移后打印 self.name 时发现的主要功能,self.name 以字节为单位,所以我找到了 b'code' 在我的整个迁移文件夹中,从字面上我发现它以字节为单位,因此将其转换为字符串格式并最终尝试它对我有用!!!!!!!!!

【讨论】:

以上是关于Django 迁移错误 KeyError: ('list', u'user')的主要内容,如果未能解决你的问题,请参考以下文章

将文件发送到 django 时出现 Keyerror/MultiValueDictKeyError

Django:request.GET 和 KeyError

扩展 django 用户 django-rest_framework 给了我 KeyError

django_heroku.settings(locals()) KeyError: 'MIDDLEWARE' 和 'MIDDLEWARE_CLASSES'

如何修复 django 错误 MultiValueDictKeyError

Django 如何摆脱迁移错误