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

时间:2016-01-19 17:17:18

标签: python django migrate makemigrations

我正在尝试运行

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一起用于之前,但这也无济于事。

无法解决问题。

10 个答案:

答案 0 :(得分:15)

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

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

答案 1 :(得分:8)

问题出在迁移文件中。 当我以某种方式提交git时,我删除了其中一个迁移文件,因此订单类似于0001 0003 0004而没有0002。 在第二个迁移文件中,我创建了一个名为user的模型。

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

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

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

答案 2 :(得分:7)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

在他对这个answer的评论中,我会用@ceasaro来表达。

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

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

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

答案 5 :(得分:0)

我遇到了类似的问题,但是,我无法在迁移文件中找出问题的根源。没有任何丢失的迁移文件。有可能我看起来不够努力。

然而,当我'squashmigrations'解决问题。我在这里做出回应,所以任何人都可以尝试这个解决方案。

答案 6 :(得分:0)

我知道这是一个老问题。但是如果有谷歌搜索的话:

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

要解决此问题,我修改了上一次迁移,删除(或注释)了与元数据更改相关的行,然后再次运行迁移命令。之后,再次运行makemigrations / migrate 命令以更新数据库中的元数据

我正在使用Django 2.0和PostgreSQL

希望您已经修复它。 JGED

答案 7 :(得分:0)

将项目移至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。现在一切正常!

答案 8 :(得分:0)

如果您不太关心历史记录的丢失,则可以转到应用程序的migrations目录,然后删除其中的所有文件。然后是makemigrationsmigrate。不会造成数据丢失,但以后可能会引起问题。

答案 9 :(得分:0)

嘿,当我将版本从 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' 在我的整个迁移文件夹中,字面上我发现它以字节为单位,因此将其转换为字符串格式并最终尝试它对我有用!!!!!!!