Django ORM 迁移在 IntegerField 上给出“ValueError:int() 的无效文字”

Posted

技术标签:

【中文标题】Django ORM 迁移在 IntegerField 上给出“ValueError:int() 的无效文字”【英文标题】:Django ORM migration giving "ValueError: invalid literal for int()" on IntegerField 【发布时间】:2016-03-10 20:05:10 【问题描述】:

一步一步,我就是这样走到现在的……

在更改我的数据库中的Order 表以包含flowertype = IntegerField() 后,我尝试运行命令python manage.py migrate,并被告知我无法继续迁移,直到我a)IntegerField() 设置一个默认值,或者 b) 让 django 为我设置它。我选择 a 并将默认值设置为 'something' 只是为了消除我的错误。

意识到我不应该将字符串放入IntegerField(),我尝试了以下方法来解决此问题。

1) 尝试将models.IntegerField() 重置为models.IntegerField(default='1')

2) 尝试使用 django-reset 重置我的 sql 数据库,它给了我大量错误,例如 `ImportError: cannot import name sql_delete

3) 注释掉我的 Order 模型,然后运行 ​​makemigrationsmigrate 无济于事。

【问题讨论】:

【参考方案1】:

在 python 中迁移失败,因此它从未进入数据库。您应该保留所有内容,然后进入 migrations/ 文件夹并删除添加了 flowertype 字段的迁移(它将是最新的)。然后再次运行python manage.py makemigrations,但请确保在模型定义中设置了flowertype = IntegerField(default=1)not default='1')。

编辑进一步解释:

当您运行命令makemigrations 时,django 会检查您在 python 中的所有模型定义并将它们与数据库中的内容进行比较。如果两者不匹配,django 将创建一个迁移文件,该文件将更新数据库以反映模型定义,因为它们在 python 代码中定义。这就是migrate 命令的作用,它运行所有新的迁移文件。

所以当您第一次运行makemigrations 时,创建了一个迁移文件,该文件向Order 表中添加了一列,并尝试将每一行的值设置为'something'

这立即失败了,因为它试图将 str 放入和 int 字段中。

由于它失败了,除非你删除文件,否则每次运行migrate,django 都会继续尝试运行该脚本。有两种选择:1)您可以直接进入并手动编辑迁移文件,或者 2)您可以删除该迁移文件并在修复模型定义后重新创建它。

【讨论】:

是的!你完全帮了我。做到了。我不能再给你 8 分钟的答案,因为 SO 不会让我这样做,但你明白了,朋友。您能否向我解释一下删除该文件的作用?谢谢一百万。 用更深入的解释编辑了回复。

以上是关于Django ORM 迁移在 IntegerField 上给出“ValueError:int() 的无效文字”的主要内容,如果未能解决你的问题,请参考以下文章

Django(20)ORM模型迁移命令

Django ORM 迁移在 IntegerField 上给出“ValueError:int() 的无效文字”

Django ORM框架

如何通过 aws redshift 管理 django'orm?

Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查

django ORM模型的数据库建表查询