Django ORM migration giving "ValueError: invalid literal for int()" on IntegerField

Django ORM migration giving "ValueError: invalid literal for int()" on IntegerField

一步一步,这就是我如何到达现在的位置...

在我的数据库中更改我的 Order table 以包含 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 无济于事。

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

编辑进一步解释:

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

因此,您第一次 运行 makemigrations 时,创建了一个迁移文件,其中向 Order table 添加了一列,并尝试设置值每行到 'something'.

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

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