• 数据库的级联删除


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

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

    class OtherModel(models.Model):
        user = models.ForeignKey(MyUser, on_delete=models.CASCADE)
    
    • 1
    • 2

    在这个例子中,如果删除与 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

    class OtherModel(models.Model):
        user = models.ForeignKey(MyUser, on_delete=models.PROTECT)
    
    • 1
    • 2

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

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

    class OtherModel(models.Model):
        user = models.ForeignKey(MyUser, on_delete=models.SET_NULL, null=True)
    
    • 1
    • 2

    如果删除与 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)
    
    • 1
    • 2

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

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

    class OtherModel(models.Model):
        user = models.ForeignKey(MyUser, on_delete=models.SET(set_user_id))
    
    • 1
    • 2

    如果删除与 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    class OtherModel(models.Model):
        user = models.ForeignKey(MyUser, on_delete=models.DO_NOTHING)
    
    • 1
    • 2

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

  • 相关阅读:
    堆 堆排序 TopK问题
    huggingface使用bert
    【Python】条件语句
    Discuz3.X各广告位的具体位置和效果探究
    resubmit 渐进式防重复提交框架简介
    Mac电脑风扇控制推荐 Macs Fan Control Pro 中文 for mac
    【R语言数据科学】(十七):常见机器学习算法(附代码实现)
    React18 基础入门API、JSX语法糖
    SQL必需掌握的100个重要知识点:过滤数据
    加密接口如何测试
  • 原文地址:https://blog.csdn.net/liulanba/article/details/134565038