Django 2.x 中 models.ForeignKey 外键 on_delete 参数详解

纸上星河
纸上星河
发布时间:2026-10-13| 6人浏览过
原创

本文详解 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 参数的说明介绍完毕,希望以上内容能为您提供参考。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。