Django 2.0+ 外键报错及数据库添加用户错误解决方案
本文详解Django 2.0后外键定义必须指定on_delete参数的原因及五种可选值,并解决添加用户时因外键约束导致的IntegrityError错误。通过修改settings.py中DATABASES配置的OPTIONS,设置foreign_key_checks为0即可快速修复该问题。
Django外键on_delete参数报错原因
在使用Django生成数据库表时,可能会遇到报错信息:__init__() missing 1 required positional argument: 'on_delete'。
产生该错误的原因如下:
自Django 2.0版本起,在定义外键(ForeignKey)或一对一关系时,必须显式添加on_delete选项。此参数旨在防止因关联表数据不一致而引发的问题,若未指定则会直接报错。
具体示例对比如下:
错误写法:owner=models.ForeignKey(UserProfile),此写法会触发报错。
正确写法:owner=models.ForeignKey(UserProfile, on_delete=models.CASCADE)。在旧版本Django中,models.CASCADE是默认值,因此无需显式写出;但在新版本中必须显式声明。
关于on_delete参数的详细说明:
on_delete共有五个可选值:CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()。
CASCADE:级联删除。当被引用的对象删除时,当前对象也随之删除。
PROTECT:保护模式。若存在关联记录,删除操作将抛出完整性错误(IntegrityError)。
SET_NULL:将外键字段设置为NULL。此选项要求该外键字段允许为NULL(null=True)。
SET_DEFAULT:将外键字段设置为一个默认值。
SET():调用外部传入的值,该值可以是一个函数。
注:在大多数常规场景下,使用CASCADE即可满足需求。
解决数据库添加用户的外键约束错误
此外,在使用Django添加用户或执行相关数据库操作时,可能会遇到以下报错:
django.db.utils.IntegrityError: (1452, 'Cannot add or update a child row: a foreign key constraint fails (`cms`.`app01_book_author`, CONSTRAINT `app01_book_author_book_id_df0ca405_fk_app01_book_id` FOREIGN KEY (`book_id`) REFERENCES `app01_book` (`id`))') [31/Mar/2019 21:20:45] "GET /addbook/ HTTP/1.1" 500 216210
解决办法是在settings.py文件的DATABASES配置中,通过OPTIONS取消外键检查:
1 DATABASES = {
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'cms', # 你的数据库名称
'USER': 'root', # 你的数据库用户名
'PASSWORD': '123456', # 你的数据库密码
'HOST': '', # 你的数据库主机,留空默认为localhost
'PORT': '3306', # 你的数据库端口
'OPTIONS': {
"init_command": "SET foreign_key_checks = 0;", # 取消外键检查
}
}
}
完成上述配置后,问题即可解决。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









