nid = models.AutoField(primary_key=True)
ID字段是自动添加的,需要自定义变量名可以自己填写.- 对于外键字段,Django会在字段名上添加_id来创建数据库中的别名
- 外链字段Foreignkey有一个null=true的设置,它允许外链接受空值null,可以给赋空值None.
多表关系的操作概要
- 1对1的关系在两张表任意一张建立关联字段并且加Unique,比如
作者表 author
id name age
1 alex 18
2 blex 30
3 clex 25
作者个人信息表 authordetail
id addr gender tel author_id(Unique)
1 北京 男 123 1
2 南京 女 1234 2
3 上海 人妖 3311 3
create table authordetail(
id int primary key auto_increment,
addr varchar(20),
gender enum("male","female"),
tel int(11)
author_id int unique,
);
- 1对多的关系 需要在多个关系的表中建立关联字段
出版社 publish
id name book
1 北京出版社 18
2 南京出版社 30
3 天津出版社 25
create table publish(
id int primary key auto_increment,
name varchar(20)
);
书籍 book 在书籍和出版社对应关系中,一个出版社会出版多本书籍,因此把多个出版社id放在book表中创建一对多的关系,并且==要建立约束==,创建关系是为了查询,创建约束是为了防止产生脏数据
id bookname price publish_id
1 python 10 1
2 java 20 1
3 go 58 2
4 php 79 3
create table book(
id int primary key auto_increment,
bookname varchar(20),
price decimal(8,2),
publish_id int,
foreign key(publish_id) reference book(id),
);
- 多对多的关系 创建第三张关系表
书籍 book
id name price publish_id
1 python 18 1
2 java 30 1
3 go 25 2
create table book(
id int primary key auto_increment,
name varchar(32),
price decimal(5,2),
publish_id int,
foreign key (publish_id) reference publish(id),
);
作者表 author
id name age
1 alex 18
2 blex 30
3 clex 25
create table author(
id int primary key auto_increment,
name varchar(32),
age int,
);
做着书籍关系表 book2auther
id book_id author_id
1 1 1
2 1 2
3 2 1
4 3 2
create table book2auther(
id int primary key auto_increment,
book_id int,
author_id int,
foreign key (book_id) reference book(id),
foreign key (author_id) reference author(id),
);
create table publish(
id int primary key auto_increment,
name varchar(20)
);
那么上面的sql语句在ORM中是怎么创建的呢,下面拿着SQL语法 举例在ORM中的语法
1. 出版社和书本的一对多关系
on_delete有6个可选值,分别是:
CASCADE 删除级联,当父表的记录删除时,子表中与其相关联的记录也会删除。即:当一个老师被删除时,关联该老师的学生也会被删除。
PROTECT 子表记录所关联的父表记录被删除时,会报ProtectedError异常。即:当一个学生所关联的老师被删除时,会报ProtectedError异常。
SET_NULL 子表记录所关联的父表记录被删除时,将子表记录中的关联字段设为NULL,注意:需要允许数据表的该字段为NULL。
SET_DEFAULT 子表记录所关联的父表记录被删除时,将子表记录中的关联字段设为一个给定的默认值。
DO_NOTHING 子表记录所关联的父表记录被删除时,什么也不做。
SET() 设置为一个传递给SET()的值或者一个回调函数的返回值,该参数用得相对较少。
2. 作者和作者详情的一对一关系
3. 书本和作者多对多的关系
我们可以看下手动创建的Book2Author
和ManyToMany创建的 book_author
表,实现的效果是一样的.