一张表中的主键只能有一个,外键可以有多个,如果一张表中多个列都需要被别的表的外键参考,需要使用候选码(非空并且唯一),具体到你的这个问题的需求可以考虑用如下方法解决:
把a表中的bookid和authorid都设置为非空并且唯一,即
create table a(bookid int not null unique, authorid int not null unique)
然后在book表和author表中就可以分别设置外键来参照a表中两个不同的字段了。
打开我的navicat,然后找到我的teacher表,选中它,然后点击菜单栏上的‘design table'
2. 在d出的对话框中找到“Foreign Keys”,然后单机。
3. 然后会出现一个设置外键的界面,一共有七列。简单介绍一下这几列的意思。‘name’:可以不填,你一会保存成功系统会自动生成。FieldName’:就是你要把哪个键设置为外键。这里选择‘dept’,‘Reference DadaBase’:外键关联的数据库。‘Reference Table‘ :关联的表 这里是dept表‘Forgin filed Names’:关联的的字段,这里是code‘ondelete’:就是删除的时候选择的动作。这里我的选择是setNull,意思就是当关联的表删除以后,teacher》dept字段会设置为null.
4. 设置完成后点击‘save’保存退出,也可以点击‘add Foreign Key’再添加一个外键。
打开我的navicat,然后找到我的teacher表,选中它,然后点击菜单栏上的‘design table’。如下图:
2. 在d出的对话框中找到“Foreign Keys”,然后单机。如下图:
3. 然后会出现一个设置外键的界面,一共有七列。简单介绍一下这几列的意思。‘name’:可以不填,你一会保存成功系统会自动生成。FieldName’:就是你要把哪个键设置为外键。这里选择‘dept’,‘Reference DadaBase’:外键关联的数据库。‘Reference Table‘ :关联的表 这里是dept表‘Forgin filed Names’:关联的的字段,这里是code‘ondelete’:就是删除的时候选择的动作。这里我的选择是setNull,意思就是当关联的表删除以后,teacher》dept字段会设置为null。如图
4. 设置完成后点击‘save’保存退出,也可以点击‘add Foreign Key’再添加一个外键。k如图:
生活中的多对一关系:班主任,班级关系。一个班主任可以带很多班级,但是每个班级只能有一个班主任
以上创建了两条老师数据
由于我们设置外键关联可以为空null=True,所以此时在班级表创建时,可以直接保存,不需要提供老师数据
以上创建了两条老师数据
由于我们设置外键关联可以为空null=True,所以此时在班级表创建时,可以直接保存,不需要提供老师数据
将老师分配个班级之后,由于班级表关联了老师字段,我们可以通过班级找到对应老师,虽然老师表中没有关联班级字段,但是也可以通过老师找到他所带的班级,这种查询方式也叫作关联查询
通过模型类名称后追加一个_set,来实现反向查询
由于我们这是一个一对多的关系,也就说明我们的老师可以对应多个班级
我们可以继续给H1老师分配新的班级
一个班级只能对应一个老师,外键是唯一的,那么你在继续给C1班级分配一个新的老师时,会覆盖之前的老师信息,并不会保存一个新的老师
把这个班级的老师删除,由于设置了外键字段可以为null,此时班级的老师选项为null
注意:
1、要记得删除之后要重新获取一次数据,否则查看到的结果中还是之前获取到的有老师的班级数据
2、c1 = Class.objects.all().first()或是c1=Class.objects.filter(id=2).first(),都需要加 .first() ,否则会报错!!!
生活中,多对多关系:一个音乐家可以隶属于多个乐队,一个乐队可以有多个音乐家
创建音乐家以及乐队
创建出两个乐队之后对其进行音乐家的添加,多对多字段添加时,可以使用add函数进行多值增加,在ManyToManyField所在模型的记录使用add方法
B1乐队含有A1,A2两名成员,B2乐队含有A1成员
可以在音乐家表中查找某个音乐家属于哪些乐队
也可以查找这音乐家在哪个乐队
多对多关联字段的删除,要使用remove来进行关系的断开,而不是直接使用delete,remove只会断开数据之间的联系,但是不会将数据删除
在B1乐队中删除A1音乐家
创建一个多对一关系的父子表,一个父亲可能有多个儿子
创建父亲和儿子们
查询所有父亲名字是jack的孩子
查询所有儿子名开头为J的父亲
获取到某一个父亲的所有孩子,通过某一条数据的小写表名_set反向查询
创建一些数据
通过soldier_set我们就可以关联到对应的士兵表,并且对应返回结果可以执行我们常用的filter,exclude等查询 *** 作
也可以通过定义关联字段中的related_name值,来实现自定义的反向查询名字,注意:related_name的值必须唯一
接下来通过某条数据反向查询
注意:related_name一定是一个唯一的值,否则反向查找时会出现二异性错误,也可以将related_name初始化为+,来取消反向查询
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)