引言
- 在django2.0之前创建外键foreignKey的参数on_delete是有默认值的,所以这个参数可以不用填,但在2.0之后on_delete没有默认值了,所以这个参数一定要传,不然就报以下的错:
TypeError: init() missing 1 required positional argument: on_delete
所以现在就来说一下关于这个on_delete要传的参数所代表的含义
on_delete
on_delete=None, # 删除关联表中的数据时,当前表与其关联的field的行为
on_delete=models.CASCADE, # 删除关联数据,与之关联也删除
on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做
on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError
# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)
# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)
on_delete=models.SET, # 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
举例
class BookInfo(models.Model):
"""
图书模型类
"""
# 图书名称
btitle = models.CharField(max_length=20)
# 出版日期
bpub_date = models.DateField()
# 阅读量
bred = models.ImageField(default=0)
# 评论量
bcomment = models.IntegerField(default=0)
# 删除标记(不做真正的删除)
is_Delete = models.BooleanField(default=False)
# 多类
class HeroInfo(models.Model):
"""
英雄人物模型类
"""
# 英雄名称
hname = models.CharField(max_length=20)
# 性别
hgender = models.BooleanField(default=False)
# 备注
hcomment = models.CharField(max_length=200)
# 关系属性
hbook = models.ForeignKey('BookInfo', on_delete=models.CASCADE)
# 删除标记(不做真正的删除)
is_Delete = models.BooleanField(default=False)
1、ForeignKey 表示设置外健
2、to_field表示外健关联的主键
3、on_delete有多个选项