TypeError: init() missing 1 required positional argument: ‘on_delete’
错误代码:
blog = models.OneToOneField(to="Blog", to_field="nid", null=True)
blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid')
问题描述
使用Django框架时,在models.py中创建多个数据库表。在第二个表中引用第一个表的id作为外键(ForeignKey)时或是表与表之间添加了一对一(OneToOneField)时,执行 python manage.py makemigrations 出现错误:
TypeError: __init__() missing 1 required positional argument: 'on_delete'
原因分析:
django 升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:
TypeError: init() missing 1 required positional argument: ‘on_delete’
on_delete参数各个值的含义:
链接: link.
由于多对多(ManyToManyField)没有 on_delete 参数,所以以上只针对外键(ForeignKey)和一对一(OneToOneField)
解决方案:
blog = models.OneToOneField(to="Blog", to_field="nid", null=True,on_delete=models.PROTECT)
blog = models.ForeignKey(verbose_name='所属博客', to='Blog', to_field='nid',on_delete=models.DO_NOTHING)