迁移Django数据库时的ValueError

时间:2017-09-27 21:12:46

标签: python django django-migrations

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

  

ValueError:基数为10的int()的无效文字:' NA'

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

那怎么可能有任何&#34; NA&#34;哪里不应该是一个?我该如何修复我的数据库?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

回答原始海报:

Eexactly这是从字符串&#39; NA&#39;无效转换后的Python错误消息。到整数:int('NA')。如果先前的迁移创建了一个字段并且您之后将null = True更改为False或字段类型或默认值,则运行migrate命令可能会出现此异常,但该值不适合于字段类型。错误已由makemigrations重复,仅在models.py中修复错误。

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

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

为Django开发人员准备文本:

这是一个非常频繁的问题,关于一个简单的拼写错误,在mekemigrations之后无法轻易解决。可以找到关于twenty similar questions at SO的关于百人参与关于此类问题的评论和答案。字段的类型通常是任何数字字段或ForeignKey。值例如是没有,&#39; NULL&#39;,&#39; - &#39;,&#39;未指定&#39;,&#39;默认值&#39;或默认相关对象的名称。无效值有时在模型中固定,但仍保留在迁移中,问题更加突出。

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

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

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

  • B)通过迁移检查,以获得更有用的错误消息。原始异常和回溯很有用,但应添加带有表名加字段名的简短文本。

(讨论后可以继续。)