Django models 模型的外键方法
一、如何构建模型外键
1. app内的外键构建
# app/models.py class App1(models.Model): pass class App2(models.Model): app2 = models.ForeignKey(App1, on_delete=models.CASCADE)
2. 跨app的外键构建
假设有两个 application,app1
和 app2
app1
下的 某个 model 为 App1
app2
下的 某个 model 为 App2
# app1/models.py class App1(models.Model): pass
构建app1
应用的App1
表的外键,其中app2
应用模型文件内的App2
表是App1
表的外表。
# app2/models.py class App2(models.Model): app1 = models.ForeignKey("app1.App1", on_delete=models.CASCADE)
二、外键约束 - 删除操作的参数配置
CASCADE
:级联更新操作。如果外键对应的那条数据被删除了,那么这条数据也会被删除。 (最常用的配置)
# app/models.py app2 = models.ForeignKey(App1, on_delete=models.CASCADE)
PROTECT
:受保护。即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
如果我们强行删除,Django就会报错。
# app/models.py app2 = models.ForeignKey(App1, on_delete=models.PROTECT)
SET_NULL:设置为空。如果外键的那条数据被删除了,那么在本条数据上就将这个字段设置为空。
如果设置这个选项,前提是要指定这个字段可以为空。(blank=True, null=True 可以指定字段为空字段,不过Django通常都会给数据库表空字段配置空字符串 ' ',把null改为 ' ')
# app/models.py app2 = models.ForeignKey(App1, on_delete=models.SET_NULL, blank=True, null=True)
SET_DEFAULT
:设置默认值。如果外键的那条数据被删除了,那么本条数据上就将这个字段设置为默认值。
如果设置这个选项,前提是要指定这个字段一个默认值。
# app/models.py app2 = models.ForeignKey(App1, default='test_default', on_delete=models.SET_DEFAULT)
SET(value)
:如果外键的那条数据被删除了。那么将会获取SET
函数中的值(value)来作为这个外键的值。SET
函数可以接收一个可以调用的对象(比如函数或者方法)。
如果是可以调用的对象,那么会将这个对象调用后的结果作为返回值return
返回回去。可以不用指定默认值
# app/models.py app2 = models.ForeignKey(App1, default='test_set', on_delete=models.SET(value))
DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。
DO_NOTHING,不处理,原数据不会有任何操作,也就是说 App1 的某条数据被删除,App2 中的引用还在,其实就是外表的外键还在。 但其实这是一种不推荐的做法,因为如果访问到App2 中的这条数据,用到了 app1 这个字段,就会报错,因为有一条数据被删除了,那么外键表内就有一条数据的外键和主表的外键对应不上,找不到,就报错了。
# app/models.py app2 = models.ForeignKey(App1, default='test_nothing', on_delete=models.DO_NOTHING)