为什么“人物表”里必须有一列叫“book_id”?——用一个问题带你彻底吃透 Django 外键
【摘要】 为什么“人物表”里必须有一列叫“book_id”?——用一个问题带你彻底吃透 Django 外键一、表结构回顾主表:BookInfo(书籍)从表:PeopleInfo(人物)——用外键指向书籍,形成 一对多。二、代码一步到位# book/models.pyclass PeopleInfo(models.Model): name = models.CharField(max_leng...
为什么“人物表”里必须有一列叫“book_id”?——用一个问题带你彻底吃透 Django 外键
一、表结构回顾
-
主表:
BookInfo
(书籍) -
从表:
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)