Django执行makemigrations时无法为Stream添加非空post字段如何解决
问题解决方案
报错原因
这个报错和你编写的add_post函数逻辑无关,是因为你的本地数据库中已经存在stream表的旧数据行,当前你调整的post字段是带非空约束的外键字段,Django无法确定要给已存在的旧行的post字段填充什么值,因此弹出了选项提示。
解决步骤
你可以根据自身实际场景选择对应方案:
方案1:开发阶段,旧stream表数据可以直接删除
- 首先删除项目对应App的
migrations目录下除__init__.py之外的所有迁移文件 - 删掉本地数据库文件(比如sqlite的
db.sqlite3文件) - 重新执行
py manage.py makemigrations和py manage.py migrate即可,没有旧数据就不会触发该提示。
方案2:生产/需要保留旧stream表数据
你可以先给字段加临时规则完成迁移,后续再调整:
- 先给
post字段添加临时兼容配置,比如允许空值过渡:
# 临时允许空值,旧数据补填完成后可以删掉这个参数改回原定义 post = models.ForeignKey(Post, on_delete=models.CASCADE, null=True)
- 执行
py manage.py makemigrations和py manage.py migrate完成迁移 - 手动给所有旧stream行的
post字段补填正确的关联值后,再把null=True参数去掉,重新执行一次迁移即可。
补充说明
你在add_post里指定的date=post.posted仅作用于新生成的Stream实例,不会影响已经存在的旧数据行,因此和本次报错没有关联。不需要给字段长期设置默认值,只要解决旧数据的填充问题即可。
内容的提问来源于stack exchange,提问作者Flow21
相关产品推荐
相关产品推荐

