Django+PostgreSQL执行migrate命令时出现TypeError错误求助
Django迁移报错:TypeError: SET_NULL() missing required positional arguments
问题根源
我帮你定位到问题的核心了!错误出在你的初始迁移文件里,你对SMSPanelInfo模型的api_key字段的default参数完全误用了:
# 初始迁移里的错误代码 ('api_key', models.TextField(default=django.db.models.deletion.SET_NULL)),
SET_NULL是专门给ForeignKey/OneToOneField的on_delete参数用的关系处理函数,它需要接收collector、field等4个参数才能正常运行,根本不能直接作为普通字段的默认值。当Django执行迁移时,会尝试获取这个字段的默认值并调用SET_NULL(),但没有传入必要的参数,于是就抛出了你看到的TypeError。
解决方案
按照以下步骤逐步修复:
修正初始迁移文件的字段定义
打开包含CreateModel操作的初始迁移文件,把api_key的default参数删掉——因为你的模型里api_key是必填的TextField,本身不需要默认值:# 修正后的api_key字段定义 ('api_key', models.TextField()),如果你确实需要给
api_key设置默认值,要改成该字段类型合法的值,比如空字符串:('api_key', models.TextField(default='')),处理后续的错误迁移(panelprofile.0003_auto_20191007_1700)
这个迁移本质上是因为初始迁移的错误才生成的,你可以根据实际情况处理:- 如果是开发环境且该迁移还没应用到数据库,直接删除这个迁移文件即可;
- 如果已经应用到数据库,可以修改这个迁移文件,确保
AlterField操作的字段定义和修正后的模型一致,或者用python manage.py migrate --fake panelprofile 0002回滚迁移标记,再重新生成正确的迁移。
重新执行迁移
确认所有迁移文件都修正完毕后,运行以下命令完成迁移:python manage.py makemigrations # 如有需要重新生成迁移文件 python manage.py migrate要是你在开发环境且数据库数据不重要,也可以重置数据库后再执行迁移,这样操作会更干净。
注意事项
以后定义模型字段时,一定要区分清楚两个参数的用途:
- 普通字段的
default参数:只能设置该字段类型合法的值(比如字符串、数字,或者无参的可调用函数); - 关系字段的
on_delete参数:才是使用SET_NULL、CASCADE这类关系处理函数的地方。
内容的提问来源于stack exchange,提问作者Pouya Kermanshahi
相关产品推荐
相关产品推荐

