Django——图书管理系统(六)

2021-01-21 06:37:26 浏览数 (1)

本文将讲述设置外键操作,关于外键的更多知识,大家可以看看数据库的知识。当然我依旧会在注释中做出一些解释。

现在我们已经有了出版社这张表,现在我们添加书籍这张表。由于出版社和书籍之间是有关系的,我们使用外键来连接两者之间的关系。在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之后,必须重新执行数据库迁移命令。

数据库迁移之后,如下所示:

0 人点赞