【问题标题】:ValueError on migrate Django Database迁移 Django 数据库时出现 ValueError
【发布时间】:2017-09-27 21:12:45
【问题描述】:

每当我想迁移我的 Django 数据库时,我都会收到上面的错误消息。

ValueError: int() 以 10 为底的无效文字:'NA'

但是,我的模型是空的。当我用Model.objects.all() 检查它们时,我得到<QuerySet []>。当我在 Django Admin 中查看我的模型时,它们也是空的。

那么怎么可能有任何不应该有的“NA”呢?我该如何修复我的数据库?

感谢您的帮助!

【问题讨论】:

  • 您需要显示完整的错误堆栈才能开始搜索您的问题
  • 在字段上定义了任何默认值吗?
  • 尝试运行grep -w "NA" */models.py */migrations/*.py。预计您的所有应用都在* 目录中。
  • 模型/迁移文件中的特定字段/列可能有一个默认值。

标签: python django django-migrations


【解决方案1】:

原始海报的答案:

这正是从字符串“NA”到整数的无效转换后的 Python 错误消息:int('NA')。如果字段已由先前的迁移创建,并且您稍后将 null=True 更改为 False 或字段类型或默认值,则运行 migrate 命令会出现此异常,但该值不适合字段类型.错误已被makemigrations 复制,在models.py 中修复它是不够的。

迁移被编译为 SQL 并通过 migrate 命令应用于数据库,即使某些命令对空表并不重要。想象一下,任何收到您的初始迁移的人可能仍然拥有数据,而您将提交无效迁移并向他发送仅包含数据失败的内容。最好它也为你失败。

为您修复:您将在回溯之前看到应用程序的名称和失败的迁移。您会在该迁移文件“that_app_name/migrations/00..that_migration.py”中找到无效的默认值“NA”,最终仍在models.py 中。模型应该是固定的,迁移文件和所有以后的迁移应该被删除并再次运行 makemigrations。 (这些迁移可以删除,因为它们都没有应用于任何数据库,因为无法应用。在这种情况下,删除比手动修复更容易,这也是经常推荐的。)


为 Django 开发人员准备文本:

这是一个非常常见的问题,即在 mekemigrations 后无法轻易修复的简单拼写错误。可以找到关于twenty similar questions at SO 的信息,大约有一百人参与参与了 cmets 并回答了此类问题。字段的类型通常是任何数字字段或 ForeignKey。值是例如无、“NULL”、“-”、“未指定”、“默认值”或默认相关对象的名称。无效值有时会在模型中修复,但在迁移中仍然存在,问题更出乎意料。

最重要的相关问题是Add a system check for an invalid default on a model field #25417。它已由 Django 1.9a1 中的71ebcb8 修复,但在 1.9 最终版本之前恢复。恢复的一个重要原因是check 验证的向后兼容性。一些有用模型的默认值可能取决于数据库数据。这在应用以前的迁移之后有效,而不是之前。 (我想,例如一个相关的对象“未知捐赠者”,它对于捐赠的统计数据比空值更有用。)

我同意Field.check()不能检查默认值,这被拒绝了。我的建议是两种可能性:

  • A) 由 makemigrations 检查,以便不创建无效迁移并防止使其变得更加复杂。 (这是向后兼容的 - 每个现有迁移或正常代码都将继续工作。如果默认值取决于数据迁移并且因此失败,则可能需要在特殊情况下应用先前的迁移。

  • B) 由迁移检查,以获得更有用的错误消息。原来的异常和回溯是有用的,但是应该加一个表名加字段名的短文本。

(可以讨论后继续。)

【讨论】:

    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 2021-02-28
    • 2016-06-14
    • 2018-03-04
    相关资源
    最近更新 更多