繁体   English   中英

迁移Django数据库时出现ValueError

[英]ValueError on migrate Django Database

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

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

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

那么,在不应该存在一个“ NA”的情况下,怎么可能呢? 我该如何修复数据库?

谢谢你的帮助!

原始海报的答案:

确切地说,这是从字符串'NA'到整数int('NA')无效转换后的Python错误消息。 如果以前的迁移已经创建了一个字段,并且您后来又将null = True更改为False或字段类型或默认值,那么运行该命令migrate导致此异常,但是该值不适用于该字段类型。 该错误已被makemigrations复制,并且不足以在models.py进行修复。

即使迁移命令对空表不重要,迁移也将被编译为SQL并通过migration命令应用于数据库。 想象一下,收到您的初始迁移的任何人都可能仍然有数据,而您将提交无效的迁移,并将仅因数据而失败的故障发送给他。 最好也为您失败。

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


为Django开发人员准备文本:

这是一个很常见的问题,关于容易错字,但在迁移之后无法轻易解决。 在SO上可以找到大约20个类似的问题,大约有100人参与了对此类问题的评论和回答。 字段的类型通常是任何数字字段或ForeignKey。 值例如为“无”,“ NULL”,“-”,“未指定”,“默认值”或默认相关对象的名称。 无效值有时在模型中固定,但在迁移中仍然存在,问题出乎意料。

最重要的相关问题是在模型字段#25417上添加无效默认值的系统检查 它已在Django 1.9a1中由71ebcb8修复,但在1.9 final之前已还原。 还原的重要原因是check验证的向后兼容性。 一些有用模型的默认值可能取决于数据库数据。 在应用先前的迁移之后,而不是之前,它可以工作。 (我想像是一个相关对象“未知的捐赠者”,它对捐赠的统计比空值更有用。)

我同意Field.check()检查默认值,该默认值被拒绝。 我的建议是以下两种可能性之一:

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

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

(可以在讨论后继续。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM