目录
一、表的几种关联关系
1.1 一对一
1、介绍:
2、举例
3、建表原则:
4、django ORM 框架实现 一对一 的表的创建
1.2 一对多
1、介绍:
2、举例
3、建表原则:
4、django ORM 框架实现 一对多 的表的创建
1.3 多对多
1、介绍
2、注意:
3、举例:
4、django ORM 框架实现 多对多 的表的创建
一、表的几种关联关系
表与表之间的关系分为三种,分别为:一对一、一对多、多对多
1.1 一对一
1、介绍:
一对一:a表中的一条数据,与b表中的一条数据,是一一对应的关系。
2、举例
学号表:
学号 | 姓名 |
2023001 | 张三 |
2023002 | 李四 |
2023003 | 王五 |
2023004 | 老六 |
学生信息表:
学号 | 年龄 | 住址 |
2023001 | 18 | 北京 |
2023002 | 19 | 上海 |
2023003 | 20 | 河北 |
2023004 | 19 | 天津 |
学号表中的每一条数据,与学生信息表中的数据,都是一一对应的。
3、建表原则:
- 主表的主键和从表的外键形成主外键关系,外键必须唯一,也就是说从表的外键必须是主键。
4、django ORM 框架实现 一对一 的表的创建
如果创建的是一对一的关系,可以在任何一个模型类使用OneToOneField
1.2 一对多
1、介绍:
表a中一条数据,对应表b中的多条数据。 表b中的一条数据,只对应表a中的一条数据。
2、举例
班级和学生:一个班级可以有多个学生,一个学生只能属于一个班级。
3、建表原则:
- 在多的一方创建一个字段作为外键指向一的一方的主键,也就是说多的一方是从表,一的一方是主表。
4、django ORM 框架实现 一对多 的表的创建
django ORM 框架实现 一对多 的表的创建:
1、创建主表,班级表
# 班级表
class Class(models.Model):
class_id = models.IntegerField(primary_key=True, verbose_name='班级id', help_text='班级id')
class_name = models.CharField(max_length=20,verbose_name='班级名称', help_text='班级名称')
2、创建从表,学生表
# 学生信息表
class Student(models.Model):
id = models.AutoField(primary_key=True, verbose_name='id主键', help_text='id主键')
name = models.CharField(max_length=20,verbose_name='姓名', help_text='姓名')
student_id = models.CharField(max_length=10,verbose_name='学号', help_text='学号',unique=True)
# 创建外键,外键需要创建多的那一个表中(从表)
# models.ForeignKey('应用名.主表的类名') 与哪个表建立外键
# on_delete= 外键的级联删除:如果父表中的记录被删除,则子表中对应的记录如何处理
# on_delete=models.CASCADE(),如果父表中的记录被删除,则子表中对应的记录自动被删除
#
class_name = models.ForeignKey('orders.Class',on_delete=models.CASCADE,verbose_name='班级', help_text='班级')
注意:
a、创建外键,外键需要创建在多的那一个表中(从表中)
b、创建外键方式:
models.ForeignKey('应用名.父表类名',on_delete=删除策略)
- models.ForeignKey('应用名.主表的类名') 与哪个表建立外键
- on_delete= 外键的级联删除:如果父表中的记录被删除,则子表中对应的记录如何处理
- models.CASCADE,如果父表中的记录被删除,则子表中对应的记录自动被删除
- models.SET_NULL:当父表数据删除时,相对应的从表数据会被自动设置为null值
- models.PROTECT:当父表数据删除时,如果有相对应的从表数据会抛出异常
- models.SET_DEFAULT: 当父表数据删除时,相对应的从表数据会被自动设置为默认值,还需要额外指定default=True
手动sql插入数据:
INSERT INTO orders_class VALUES (1,"一班"),(2,"二班"),(3,"三班"),(4,"四班");
INSERT INTO orders_student VALUES (2,"张三","0002",1);
INSERT INTO orders_student VALUES (3,"张四","0003",1);
INSERT INTO orders_student VALUES (4,"张五","0004",2);
INSERT INTO orders_student VALUES (5,"张六","0005",2);
INSERT INTO orders_student VALUES (6,"张姗姗","0006",3);
INSERT INTO orders_student VALUES (7,"张红","0007",3);
INSERT INTO orders_student VALUES (8,"王莫涵","0008",3);
INSERT INTO orders_student VALUES (9,"李珍珍","0009",4);
INSERT INTO orders_student VALUES (10,"阿三","0010",4);
1.3 多对多
1、介绍
在多对多关系中,A 表中的一行可以匹配 B 表中的多行,反之亦然。
要创建这种关系,需要定义第三个表,称为结合表,它的主键由 A 表和 B 表的外部键组成。
2、注意:
多对多的创建原则:二个表与中间表创建1对多的关系。
3、举例:
如,学生选课兴趣课程场景。一个学生可以选多门课程。一个课程,可以让多个孩子上。
4、django ORM 框架实现 多对多 的表的创建
如果创建的是多对多的关系,可以在任何一个模型类使用ManyToManyField