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
模型,然后运行 makemigrations
和 migrate
无济于事。
【问题讨论】:
【参考方案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 ORM 迁移在 IntegerField 上给出“ValueError:int() 的无效文字”
如何通过 aws redshift 管理 django'orm?
Django项目的创建与介绍.应用的创建与介绍.启动项目.pycharm创建启动项目.生命周期.三件套.静态文件.请求及数据.配置Mysql完成数据迁移.单表ORM记录的增删改查