Django models 模型的外键方法

django2024-09-17312

一、如何构建模型外键

1. app内的外键构建

# app/models.py

class App1(models.Model):
    pass

class App2(models.Model):
    app2 = models.ForeignKey(App1, on_delete=models.CASCADE)

2. 跨app的外键构建

假设有两个 applicationapp1app2

app1 下的 某个 modelApp1

app2 下的 某个 modelApp2

# 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)