外键
在MySQL
中,表有两种引擎,一种是InnoDB
,另外一种是myisam
。如果使用的是InnoDB
引擎,是支持外键约束的。
外键的使用
- 使用外键前需要先确保相应外键已存储在数据库中(flask中会在你引用时自动保存相应外键)。
- 如果想要引用另外一个
app
的模型,那么应该在传递to
参数的时候,使用app.model_name
进行指定。 - 如果模型的外键引用的是本身自己这个模型,那么
to
参数可以为'self'
,或者是这个模型的名字。
外键的删除
如果一个模型使用了外键。那么在对方那个模型被删掉后,该进行什么样的操作。可以通过on_delete
来指定。可以指定的类型如下:
- CASCDE:级联删除,即如果这条数据中外键对应的数据被删除了,那么这条数据也将被删除。
- PROTECT:受保护。如果要删除这条数据中外键对应的数据,系统将会报错,即只要这条数据引用了外键的那条数据,那么就不能删除外键的那条数据。
- SET_NULL:设置为空,即如果这条数据中外键对应的数据被删除了,那么这条数据的相应字段将设置为空。需要注意,使用这个方法需保证当前字段可以为空,可用null=True的方法来设置。
- SET_DEFAULT:设置为默认值,即如果这条数据中外键对应的数据被删除了,那么这条数据的相应字段将设置为默认值。需要注意,使用这个方法需保证当前字段已指定默认值,可用default=(某固定值/函数)的方法来设置。
- SET():功能与SET_DEFAULT类似,即如果外键对应的那条数据被删除了。那么将会获取
SET
函数中的值来作为这个外键的值。SET
函数可以接收一个可以调用的对象(比如函数或者方法),如果是可以调用的对象,那么会将这个对象调用后的结果作为值返回回去。 - DO_NOTHING:不采取任何行为。一切全看数据库级别的约束。
表关系
表之间的关系都是通过外键来进行关联的。而表之间的关系,无非就是三种关系:一对一、一对多(多对一)、多对多等。以下将讨论一下三种关系的应用场景及其实现方式。
注:在`一对多(多对一)`的情况下`多`的那方是`外键的引用方`也就是模型属性包含相应外键的那方,`一`的那方是`被外键引用的那方`也就是模型属性不包含相应外键的那方
一对多
- 场景说明:比如文章和作者之间的关系。一个文章只能由一个作者编写,但是一个作者可以写多篇文章。文章和作者之间的关系就是典型的多对一的关系。
- 如果当前模型被其他模型通过外键的形式引用,那么django会自动为该模型生成一个方法,该方法通过引用模型名的小写 + _ + set的形式调用,这个方法与一般模型中的objects方法类似,可使用all()、get(),first()、filter()等方法获取里面的数据。如果需要将一篇文章添加到某个