【问题标题】:Django - wont let me add a new field to my model because 1054, "Unknown column 'field list'")Django - 不允许我在模型中添加新字段,因为 1054,“未知列‘字段列表’”)
【发布时间】:2019-01-23 15:21:10
【问题描述】:

我正在尝试按照简单的规则向我的数据库中的模型添加一个布尔字段:

- add field to model
- python manage.py makemigrations app
- python manage.py migrate app

除了 99% 的时间外,所有时间都有效。因此,在第二步(makemigrations)中,随着我在模型中新添加的字段急需使用,我收到一个错误:

django.db.utils.OperationalError: (1054, "Unknown column 'model.field' in 'field list'")

非常好。它不让我通过添加新字段来进行迁移.....因为它找不到我要新添加的字段...非常有意义!

无论如何,我已经删除了所有迁移,删除了我的新字段,再次进行迁移,迁移......一切都很好 - 所以现在我只有 1 个迁移文件 (0001)......

按照与上述相同的步骤...错误

我在这里错过了什么可笑的东西吗?我的意思是,向模型添加字段非常简单,我可能已经做了 1000 次。姜戈为什么这么逗我

编辑:答案:

好的,我已经完成了。

在删除迁移文件、截断迁移表并使用 0001_initial.py 迁移后,我创建了一个空迁移文件(python manage.py makemigrations --empty app)并手动添加了该字段......然后我迁移了它奏效了!老实说,对此感到困惑,但至少已经做出了改变:

  • 删除所有迁移文件
  • 截断 django_migrations 表
  • 评论新的布尔字段
  • 运行 python manage.py makemigrations
  • 运行 python manage.py migrate --fake
  • 运行 python manage.py makemigrations --empty app
  • 将字段手动添加到操作中的空迁移文件中:

    migrations.AddField('modelName', 'fieldName', models.BooleanField(default=False)),
    
  • 运行 python manage.py migrate

  • 取消注释新的布尔字段,使其代表您在迁移操作中所做的内容

【问题讨论】:

  • 好吧,通过删除所有旧的迁移文件,现在新的迁移文件将从头开始构建一个数据库。但是数据库不是从零开始的,它已经有很多表(和列)。所以它会抱怨重复的表/列/等。
  • 但是这个错误发生在我这样做之前。当我这样做时,迁移工作正常。当我尝试添加一个新字段时,它会抱怨。与任何重复无关...

标签: django


【解决方案1】:

请按照以下步骤操作:

  • 删除所有迁移文件
  • 截断 django_migrations 表
  • 评论新的布尔字段
  • 运行python manage.py makemigrations
  • 运行python manage.py migrate --fake
  • 取消注释布尔字段
  • 运行python manage.py makemigrations
  • 运行python manage.py migrate

通常这些步骤可以解决任何类型的迁移问题

另一个原因可能是,如果您使用的是 django_rest_framework,那么序列化程序也需要根据您的模型更改进行更新。

【讨论】:

  • 感谢您的帮助。我已经做了所有事情,但是当我取消注释布尔字段并运行 makemigrations 它仍然会发生!!!啊!!!
  • 我真的不明白这个。我做了这么多迁移,为什么现在会出现这种情况?
  • OK 我已经完成了:删除迁移文件,截断迁移表并使用 0001_initial.py 迁移后,我创建了一个空迁移文件(python manage.py makemigrations --empty app)并添加它是手动的....然后我迁移并且它工作了!老实说,对此感到困惑,但至少已经做出了改变。感谢您的帮助
  • 很高兴我能帮上忙。我过去也遇到过这样的问题。这让我想出了这样的策略。它一直在拯救我。你应该接受我的回答,这样其他人就不必再在这个话题上大吵大闹了。
  • 您的解决方案无法解决问题。我解决这个问题的唯一方法:在数据库中手动创建列,然后进行迁移。
【解决方案2】:

这是一个一直困扰着我的问题,并导致我陷入了很多丢表等问题。当 django 询问您是否要重命名该模型的字段时,我发现一个简单的解决方案是回答“N”(运行 makemigrations 时)。然后基本上执行的是删除您以前的字段并创建新字段。请小心,因为您可能会丢失现有字段上的数据,因此这适用于新字段或相对容易“重新填充”所需数据的字段。如果在 makemigrations 后迁移时出现无法“删除字段”的错误,您可能需要运行 --fake。如果您想回到问题出现之前的迁移状态,您可能需要删除此后所做的迁移并尝试上述解决方案。

更新: 我为布尔字段执行了上述操作,并保留了我的数据。尽管我说的是 N,但它似乎本质上是一个重命名。

【讨论】:

    【解决方案3】:

    问题的另一个来源:我有一个基于模型的 ModelForm。 ModelForm 定义定义了两个额外的字段。在执行迁移步骤之前,我必须从表单定义中注释掉这两个字段。迁移完成后,我取消了这两个字段的注释。

    【讨论】:

    • 这不是答案,因此请将此答案迁移到评论部分以告知其他人。当有对 OP 和其他人有帮助的答案时创建一个答案。谢谢
    • 不清楚你的意思,艾哈迈德。该问题确定了一个可能有几个根本原因的问题。我已经解决了问题的一个可能原因。
    • 您的地址无人接听!这是答案部分。
    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2013-12-10
    • 2016-04-05
    相关资源
    最近更新 更多