本文将讲述设置外键操作,关于外键的更多知识,大家可以看看数据库的知识。当然我依旧会在注释中做出一些解释。
现在我们已经有了出版社这张表,现在我们添加书籍这张表。由于出版社和书籍之间是有关系的,我们使用外键来连接两者之间的关系。在models.py的内容如下:
代码语言:javascript复制from django.db import models
# Create your models here.
"""
书和出版社之间是有关系的。书是出版社出版的。
例如机械工业出版社出版了《数据结构和算法分析——C语言描述》这本书。
那么,我们下面的出版社这张表就需要和书这张表就有一个关系,一个出版社可以出版多本书。
"""
class Publisher(models.Model):
"""
Django的models会默认在数据库中创建主键
"""
name = models.CharField(max_length=128) # 出版社名称
class Book(models.Model):
name = models.CharField(max_length=128) # 书名
publisher_id = models.ForeignKey('Publisher', on_delete=models.CASCADE)
# 外键默认关联的是Publisher表的主键。
'''
ForeignKey的第一个参数是需要关联的表的类名,可以直接写类名,但是这个时候一定是该类被定义在前文。
也可以是把类名变成字符串,这样就不要求该类一定被定义在前文。
第二个参数on_delete在Django2.0之后必须填写,models.CASCADE表示级联删除。级联删除意味着,我删除了某个出版社,那么该出版社对应的所有书籍也被删除。
models.PROTECT:保护,如果某个出版社还有书籍存在,那么就不允许删除该出版社。
models.SET_DEFAULT:表示删除后设为默认值
models.SET_NULL:删除后设为空值
models.SET(x):删除后设为某个值
'''
增加一张表之后,我们应该执行数据库迁移命令。如下图所示。
这样就完成了数据库的迁移。之后,你会发现表的结构如下。
publisher_id_id这个名字很奇怪,这是因为models会自动给外键加上_id这个后缀,所以,修改我们的Book类如下:
代码语言:javascript复制class Book(models.Model):
name = models.CharField(max_length=128) # 书名
publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE)
修改了models之后,必须重新执行数据库迁移命令。
数据库迁移之后,如下所示: