django 外键引用自身和on_delete参数

2023-03-06 19:19:58 浏览数 (1)

案例. 该模型使用外键引用自己本身。

代码语言:javascript复制
from django.db import models

class Category(models.Model):
    name = models.TextField()
    parent_cat = models.ForeignKey('self',on_delete=models.CASCADE)

on_delete参数如下:

  1. CASCADE:级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。
  2. PROTECT:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。如果我们强行删除,Django就会报错。
  3. SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
  4. SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,== 前提是要指定这个字段一个默认值 ==。
  5. SET():如果外键的那条数据被删除了。那么将会获取SET函数中的值来作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。== 可以不用指定默认值 ==
  6. DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。

注意:以上的配置都是django级别的,在数据库中的级别依旧是RESTRICT

数据库层面的约束有:

  1. RESTRICT:默认的选项,如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;
  2. NOACTION:同 RESTRICT效果一样,也是首先先检查外键;
  3. CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;
  4. SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;

为什么在django中可以是用不同的约束去操作数据库呢。

比如 django 中 on_delete=CASCADE, 但是数据库的外键约束是RESTRICT. 在进行删除A表数据时,发现被外键约束着,使数据不能被删除,则django会先去删除约束的B表数据,然后再来删除A表数据。

0 人点赞