外键删除操作:
如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过 on_delete 来指定。可以指定的类型如下:
- CASCADE :级联操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。
- PROTECT :受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
- SET_NULL :设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。如果设置这个选项,前提是要指定这个字段可以为空。
- SET_DEFAULT :设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。如果设置这个选项,前提是要指定这个字段一个默认值。
- SET() :如果外键的那条数据被删除了。那么将会获取 SET 函数中的值来作为这个外键值。 SET 函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。
- DO_NOTHING :不采取任何行为。一切全看数据库级别的约束。
以上这些选项只是Django级别的,数据级别依旧是RESTRIC
on_delete参数的各个值的含义:
参数:on_delete=???, # 删除关联表中的数据时,当前表与其关联的field的行为
1. on_delete=models.CASCADE, # 删除关联数据,与之关联也删除 (如: 删除python学院的时候,则把与python学院关联的那些数据也删除)
on_delete=models.DO_NOTHING, # 删除关联数据,什么也不做
3. on_delete=models.PROTECT, # 删除关联数据,引发错误ProtectedError (与数据库的条件一样了,如果这个学院还有人,则不能删除这个学院)
2. on_delete=models.SET_NULL, # (需要设置null=True, 如把这个学院删除了,则与之关联的数据则设置为 null) # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空null=True,一对一同理)
models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理 如下:
models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET, # 删除关联数据,
a. 与之关联的值设置为指定值,设置:models.SET(值)
b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)