ORM的注意事项
  • 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. 出版社和书本的一对多关系

Django ORM多表操作_外链
on_delete有6个可选值,分别是:
CASCADE 删除级联,当父表的记录删除时,子表中与其相关联的记录也会删除。即:当一个老师被删除时,关联该老师的学生也会被删除。
PROTECT 子表记录所关联的父表记录被删除时,会报ProtectedError异常。即:当一个学生所关联的老师被删除时,会报ProtectedError异常。
SET_NULL 子表记录所关联的父表记录被删除时,将子表记录中的关联字段设为NULL,注意:需要允许数据表的该字段为NULL。
SET_DEFAULT 子表记录所关联的父表记录被删除时,将子表记录中的关联字段设为一个给定的默认值。
DO_NOTHING 子表记录所关联的父表记录被删除时,什么也不做。
SET() 设置为一个传递给SET()的值或者一个回调函数的返回值,该参数用得相对较少。

2. 作者和作者详情的一对一关系

Django ORM多表操作_字段_02

3. 书本和作者多对多的关系

Django ORM多表操作_一对多_03
我们可以看下手动创建的Book2Author 和ManyToMany创建的 book_author表,实现的效果是一样的.
Django ORM多表操作_外链_04