56.ORM外键删除详解

外键删除操作:

如果一个模型使用了外键。那么在对方那个模型被删除了之后,该进行什么样的操作。可以通过on_delete来指定。可以指定的类型如下:

  1. CASCADE:级联操作。如果外键应用的那个模型中对应的数据被伤了,那么该条数据也会被删除。
author = models.ForeignKey('User',on_delete=models.CASCADE)
  1. PROTECT:受保护的。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据了
author = models.ForeignKey('User',on_delete=models.PROTECT)
  1. SET_NULL:设置为空。如果外键的那条数据被删除了,那么本条数据就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
author = models.ForeignKey('User',on_delete=models.SET_NULL,null=True)
  1. SET_DEFAULT:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。
author = models.ForeignKey('User',on_delete=models.SET_DEFAULT,default=User.objects.get(pk=4))
  1. SET(): 如果外键的那条数据被删除了。那么将会获取SET函数中的值未作为这个外键的值。SET函数可以接收一个可以调用的对象(比如函数或者是方法),如果是可以调用的对象,那么将会将这个对象调用后的结果作为值返回回去。
author = models.ForeignKey('User',on_delete=models.SET(User.objects.get(pk=4)),null=True)

# 或者是将默认值定义为一个函数的返回值
def default_category():
	return Category.objects.get(pk=4)

# 此时,
author = models.ForeignKey('User',on_delete=models.SET(default_category),null=True)
  1. DO_NOTHING:不采取任何行动,一切全看数据库级别的约束。
以上这些选项只是Django级别的,默认情况下数据库级别的依旧是RESTRICT,就相当于Django级别的PROTECT,即受保护的。
author = models.ForeignKey('User',on_delete=models.DO_NOTHING,null=True)
此时如果将父表中的一条被引用的数据删除的话,就会报错,不能够进行删除。但是可以通过将数据库中被引用的字段的删除时的限制修改为CASCADE,就可以将数据进行删除了。
发布了120 篇原创文章 · 获赞 28 · 访问量 4641

猜你喜欢

转载自blog.csdn.net/zjy123078_zjy/article/details/104056850
今日推荐