Django migrations error KeyError: ('list', u'user')

Django migrations error KeyError: ('list', u'user')

我正在尝试 运行

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 中提取我的应用程序的另一个版本后发生的。

我在另一台机器上用相同的代码没有这个错误。 我试过将 --fakezero 一起使用,或将 squashmigrations 与之前的一起使用,但这也无济于事。

不知道如何解决。

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

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

我通过手动将此代码添加到 0001 迁移文件解决了这个问题:

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

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

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

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

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

显然,重构也发生在迁移文件中。当打开迁移文件并改回原来的命名时,makemigrations 命令工作正常。

我找到了导致此问题的原因及其解决方案。如果您有一个包含 "replaces" 属性 的压缩迁移,请删除 "replaces" 中引用您的 django_migrations table 中缺少的迁移的元组。这修复了它。

我会用@ceasaro 的话来表达他对此的评论answer

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

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

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

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

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

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

我正在使用 Django 2.0 和 PostgreSQL 9.6

希望您已经修复了它。 JGED

编辑:PostgreSQL 版本

将我们的项目移动到 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。现在一切正常!

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

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

关于 python manage.py 迁移 我遇到了同样的问题 KeyError on doing migrate

我在网上搜索了一下,没有找到所以我尝试调试root 在出现问题的模块中运行 lib/python3.8/site-packages/django/db/migrations/operations/fields.py”,第 167 行,在 state_forwards

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

我正在使用 Python3.9 和 DJango 4.1.dev20211216191317。

我是怎么出现这个问题的:

我创建了我的模型,进行了迁移、迁移,然后想改变一些东西。我不担心数据丢失,所以我使用 psycopg2 登录我的 postgres 数据库,创建游标,找到 Django 创建的数据库表并手动删除它们,提交(尽管我认为你不必提交table 掉线),并关闭了连接。然后我删除了我的小程序的迁移文件夹中的文件,并在更新我的 models.py 后尝试进行迁移。这导致了我的问题。

我是如何修复的:

据我所知,因为这就是我所做的一切,在重复上述几次并出现相同错误后,我保留了创建的最新迁移文件(看起来像 00001_init.py,或者类似的东西),运行 showmigrations 并看到 Django 在我的小程序中识别了它,然后 migrate --fake my_applet 零。我想我然后删除了迁移文件,然后又进行了一次makemigrations和migrate,能够成功迁移。