Django 2.x 中 models.ForeignKey 外键 on_delete 参数详解
本文详解 Django 2.x 版本中 models.ForeignKey 外键字段的 on_delete 参数。从 Django 2.0 开始,定义外键必须显式指定 on_delete 选项,否则将抛出 TypeError。文章列举了 CASCADE、PROTECT、SET_NULL 等五种可选值及其行为,并通过代码示例对比了新旧版本的写法差异,帮助开发者避免数据不一致和创建/删除记录时的约束报错问题。
Django 2.x ForeignKey on_delete 参数详解
以下是相关代码示例。
class GroupInfos(models.Model):
uid = models.AutoField(primary_key=True)
caption = models.CharField(max_length=32, unique=True)
ctime = models.DateTimeField(auto_now_add=True, null=True)
uptime = models.DateTimeField(auto_now=True, null=True)
class UserInfos(models.Model):
username = models.CharField(max_length=32, blank=True, verbose_name='用户名')
password = models.CharField(max_length=64, help_text='text')
email = models.EmailField(max_length=60)
user_group = models.ForeignKey('GroupInfos', to_field='uid', on_delete='CASCADE')
具体说明如下。
第一个类定义了一个名为 app_groupinfos 的数据表。
第二个类定义了一个名为 app_userinfos 的数据表。
on_delete 参数选项说明
1、使用 ForeignKey 字段来设置外键关系。
2、to_field 参数用于指定外键关联的主键字段。
3、on_delete 参数提供了多种可选的处理方式。
在 Django 2.0 及更高版本中,定义外键或一对一关系时必须添加 on_delete 选项。该参数的作用是确保两个表之间的数据一致性,若未指定则会引发报错。
TypeError: __init__() missing 1 required positional argument: 'on_delete'
以下通过具体示例进行说明。
user=models.OneToOneField(User) owner=models.ForeignKey(UserProfile)
需要修改为以下写法:
user=models.OneToOneField(User,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值 owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值
参数具体说明如下。
on_delete 支持 CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET() 五种可选值。
CASCADE:设置此值表示级联删除。
PROTECT:设置此值时,若尝试删除关联对象,系统将抛出完整性错误。
SET_NULL:设置此值会将外键字段设置为 null,前提是数据库允许该字段为空。
SET_DEFAULT:设置此值会将外键字段设置为默认值。
SET():设置此值会调用外部传入的值,该值可以是一个函数。
在大多数常规场景下,使用 CASCADE 即可满足需求。
此时,一个 group 记录可以对应多个 user 记录,形成一对多的关系。
当我们需要查询某个组包含哪些用户时,就会用到当前定义的外键关系。
外键约束对记录创建与删除的影响
创建记录的情况。
此外,在类中定义了 ForeignKey 之后,如果 group 记录尚不存在,由于外键约束的存在,user 表中的记录也无法被创建。
删除记录的情况。
同样,在类中定义了 ForeignKey 之后,如果 user 表中存在关联记录,由于外键约束,group 表中的对应记录也无法被删除。
补充知识:关于 owner = models.ForeignKey(User) 出现 TypeError 的说明。
owner = models.ForeignKey(User) 出现错误 TypeError: __init__() missing 1 required positional argument: 'on_delete' owner = models.ForeignKey(User)
具体报错信息如下。
TypeError: __init__() missing 1 required positional argument: 'on_delete'
解决方法如下。
owner = models.ForeignKey(User, on_delete=models.CASCADE)
以上关于 Django 2.x 版本中 models.ForeignKey() 外键 on_delete 参数的说明介绍完毕,希望以上内容能为您提供参考。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













