为什么“人物表”里必须有一列叫“book_id”?——用一个问题带你彻底吃透 Django 外键

举报
周杰伦本人 发表于 2025/08/31 19:55:37 2025/08/31
【摘要】 为什么“人物表”里必须有一列叫“book_id”?——用一个问题带你彻底吃透 Django 外键一、表结构回顾主表:BookInfo(书籍)从表:PeopleInfo(人物)——用外键指向书籍,形成 一对多。二、代码一步到位# book/models.pyclass PeopleInfo(models.Model): name = models.CharField(max_leng...

为什么“人物表”里必须有一列叫“book_id”?——用一个问题带你彻底吃透 Django 外键

一、表结构回顾

  1. 主表:BookInfo(书籍)

  2. 从表:PeopleInfo(人物)——用外键指向书籍,形成 一对多

二、代码一步到位

# book/models.py
class PeopleInfo(models.Model):
    name  = models.CharField(max_length=20, unique=True, verbose_name='姓名')
    gender = models.SmallIntegerField(
        choices=((1, '男'), (2, '女')),   # 枚举
        default=1,
        verbose_name='性别'
    )
    description = models.CharField(max_length=200, blank=True, verbose_name='描述')
    is_deleted = models.BooleanField(default=False, verbose_name='逻辑删除')

    # 外键:人物所属书籍
    book = models.ForeignKey(
        BookInfo,                # 关联主表
        on_delete=models.CASCADE, # 级联删除:书没了,人也跟着没
        verbose_name='所属书籍'
    )

    class Meta:
        db_table = 'tb_people'
        verbose_name = '人物'
        verbose_name_plural = verbose_name

这是两个类的定义
三、关键细节

要点 说明
choices 枚举:数据库只存 1/2,后台/表单显示“男/女”。
on_delete=models.CASCADE 级联删除;还可选 SET_NULL / PROTECT / SET_DEFAULT
外键字段名 代码里写 book数据库自动生成 book_id(自动加 _id)。
unique=True 重名检测:公司里不允许出现第二个“张伟”。

四、迁移必做

python manage.py makemigrations   # 生成迁移文件
python manage.py migrate          # 真正建表

第一条是生成迁移文件 第二条是真正建表

五、快速验证

最后一步就是验证了,也就是我们写的有没有效果

mysql> USE work_42_01;
mysql> SHOW TABLES;
+----------------------+
| tb_book              |
| tb_people            |
+----------------------+

mysql> DESC tb_people;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(20)  | NO   | UNI | NULL    |                |
| gender     | smallint(6)  | NO   |     | 1       |                |
| description| varchar(200) | YES  |     | NULL    |                |
| is_deleted | tinyint(1)   | NO   |     | 0       |                |
| book_id    | int(11)      | NO   | MUL | NULL    |                |
+------------+--------------+------+-----+---------+----------------+

看到 book_id 和外键约束 MUL 即成功。

六、课间一句话

记住 3 个词:外键字段 book代码里写 book,数据库自动生成 book_id(自动加 _id),级联 CASCADE,迁移的两行命令。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。