数据库的级联删除

级联删除是指在数据库中删除一个对象时,与该对象有关的其他对象也被自动删除。在 Django 中,级联删除通常通过在模型中定义外键时使用 on_delete 参数来实现。以下是一些常见的 on_delete 选项:

1.models.CASCADE: 当关联的对象被删除时,删除包含外键的对象。这是级联删除的默认选项。

复制代码
class OtherModel(models.Model):
    user = models.ForeignKey(MyUser, on_delete=models.CASCADE)

在这个例子中,如果删除与 OtherModel 关联的 MyUser 对象,相关的 OtherModel 对象也将被删除。

2.多级联删除: 如果你有多个模型之间存在多级关系,级联删除会依次传播。例如,如果有三个模型 A、B、C,A 与 B 有外键关系,B 与 C 有外键关系,如果删除 A,则 B 和 C 中相关的对象也会被删除。

复制代码
class B(models.Model):
    a = models.ForeignKey(A, on_delete=models.CASCADE)

class C(models.Model):
    b = models.ForeignKey(B, on_delete=models.CASCADE)

删除 A 对象时,与 A 关联的 B 对象也将被删除,进而与 B 关联的 C 对象也会被删除。

3.models.PROTECT: 防止删除关联的对象。如果试图删除关联的对象,将引发 ProtectedError 异常。

复制代码
class OtherModel(models.Model):
    user = models.ForeignKey(MyUser, on_delete=models.PROTECT)

如果试图删除与 OtherModel 关联的 MyUser 对象,将引发 ProtectedError 异常,从而防止删除。

4.models.SET_NULL: 将外键设置为 NULL(仅适用于可为 NULL 的外键字段)。

复制代码
class OtherModel(models.Model):
    user = models.ForeignKey(MyUser, on_delete=models.SET_NULL, null=True)

如果删除与 OtherModel 关联的 MyUser 对象,OtherModel 中的 user 外键将被设置为 NULL。

5.models.SET_DEFAULT: 将外键设置为默认值。

复制代码
class OtherModel(models.Model):
    user = models.ForeignKey(MyUser, on_delete=models.SET_DEFAULT, default=default_user_id)

如果删除与 OtherModel 关联的 MyUser 对象,OtherModel 中的 user 外键将被设置为默认值。

models.SET: 将外键设置为指定的值。

复制代码
class OtherModel(models.Model):
    user = models.ForeignKey(MyUser, on_delete=models.SET(set_user_id))

如果删除与 OtherModel 关联的 MyUser 对象,OtherModel 中的 user 外键将被设置为指定的值。

models.SET_NULL 和 models.SET_DEFAULT 的注意事项: 这两个选项只能用于可为 NULL 的外键字段。如果外键字段不可为 NULL,使用这两个选项将会引发 ValueError。

复制代码
class OtherModel(models.Model):
    user = models.ForeignKey(MyUser, on_delete=models.SET_NULL, null=True)  # 可以使用
    user = models.ForeignKey(MyUser, on_delete=models.SET_DEFAULT, default=default_user_id, null=True)  # 可以使用

    user = models.ForeignKey(MyUser, on_delete=models.SET_NULL)  # 会引发 ValueError
    user = models.ForeignKey(MyUser, on_delete=models.SET_DEFAULT, default=default_user_id)  # 会引发 ValueError

6.models.DO_NOTHING: 什么也不做。删除关联的对象后,不对外键进行任何操作。

复制代码
class OtherModel(models.Model):
    user = models.ForeignKey(MyUser, on_delete=models.DO_NOTHING)

使用这个选项时,你需要确保在数据库级别处理外键的完整性。这通常需要你手动管理外键的约束。

相关推荐
疯狂的挖掘机15 小时前
记一次基于QT的图片操作处理优化思路(包括在图上放大缩小,截图,画线,取值等)
开发语言·数据库·qt
奇树谦17 小时前
Qt | 利用map创建多个线程和定时器
网络·数据库·qt
用户479492835691517 小时前
性能提升 4000%!我是如何解决 运营看板 不能跨库&跨库查询慢这个难题的
数据库·后端·postgresql
电商API&Tina17 小时前
跨境电商 API 对接指南:亚马逊 + 速卖通接口调用全流程
大数据·服务器·数据库·python·算法·json·图搜索算法
robinson198817 小时前
验证崖山数据库标量子查询是否带有CACHE功能
数据库·oracle·cache·自定义函数·崖山·标量子查询
老华带你飞17 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
SelectDB18 小时前
5 倍性能提升,Apache Doris TopN 全局优化详解|Deep Dive
数据库·apache
JIngJaneIL18 小时前
基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
陈平安安19 小时前
设计一个秒杀功能
java·数据库·sql
isNotNullX19 小时前
数据处理的流程是什么?如何进行数据预处理?
数据库·数据资产管理·数据处理·企业数字化