多表模型
创建表
表的关系:
1  | Author表和AuthorDetail表是一对一  | 
一对一的关系 OneToOneField
第一种OneToOneField
1  | class Author(models.Model):  | 
第二种ForeignKey(unique=True)
1  | authordetail=models.ForeignKey(unique=True)  | 
一对多和多对多的关系 ForeignKey ManyToManyField
1  | class Publish(models.Model):  | 
注意
1  | #用了OneToOneField和ForeignKey,模型表的字段,后面会自定加_id  | 
插入表
启动django
1  | import os  | 
orm增加操作多对一
最终对象修改
增加方式一
1  | book=Book(name='金瓶梅',price=34.5,publish_id=1)  | 
增加方式二
1  | ret = Book.objects.create(name='红楼梦',price=34.5,publish_id=1)  | 
增加方式三
1  | publish = Publish.objects.get(pk=2)  | 
orm修改操作多对一
最终对象修改
修改方式一
1  | publish = Publish.objects.get(pk=2)  | 
修改方式二
1  | publish = Publish.objects.get(pk=2)  | 
queryset对象修改
修改方式三
1  | # 一先拿到publish对象  | 
多对一删除
1  | # 一先拿到publish对象  | 
orm增加操作多对多
增加方式一 add传入对象
1  | shouyue = Author.objects.get(pk=1)  | 
增加方式一 add传入id
1  | book = Book.objects.get(pk=1)  | 
orm删除操作多对多
删除方式一 remove传入对象
1  | shouyue = Author.objects.get(pk=1)  | 
删除方式一 remove传入id
1  | book=Book.objects.get(pk=1)  | 
清空clear
1  | book = Book.objects.get(pk=1)  | 
先清空在修改set
1  | shouyue = Author.objects.get(pk=1)  | 
基于基于对象的跨表查询的查询
基于对象的查询实质上是子查询
正向
关联字段在谁那里
一对一正向查询
查询shouyue作者的手机号
手机号在AuthorDetail里面 正向查询 跨表的话,按字段
1  | shouyue=Author.objects.get(pk=2)  | 
一对一反向查询
跨表的话,按表名小写
1  | authordetail=AuthorDetail.objects.get(pk=1)  | 
相同地址有不同的作者和电话2组一对一
1  | authordetail=AuthorDetail.objects.filter(addr= '长沙')  | 
多对多正向查询 按字段.all()
1  | book=Book.objects.filter(name='红楼梦').first()  | 
多对多反向查询得到的是queryset对象
1  | shouyue=Author.objects.filter(name='shouyue').first()  | 
打印查询的sql
1  | # 在settings里面配置  | 
基于双下划线的查询
双下划线正向的理解
字段__字段
双下划线反向的理解
表名__字段
基于双下划线的查询一对一
正向查询跨表按values(字段__字段 )
1  | phone=Author.objects.filter(name ='shouyue').values('authordetail__phone')  | 
反向查询跨表按表名小写filter(表名__字段)
1  | authordetail=AuthorDetail.objects.filter(author__name='shouyue').values('phone')  | 
注意也可以查询多个字段
1  | phone=Author.objects.filter(name='shouyue').values('sex','authordetail__phone')  | 
无论是正向和反向 filter values都可以跨表
练习
1  | 查询手机号是123333333 作者的性别  | 
基于双下划线的查询一对多
正向查询
1  | # 正向查询  | 
正向查询增加模糊查询gt大于
1  | # 正向查询北京出版社大于100元的书  | 
反向查询
1  | # 反向查询  | 
反向查询增加模糊查询gt大于
1  | # 反向查询北京出版社大于100元的书  | 
基于双下划线的查询多对多
查询红楼梦所有作者的名字
正向
1  | authors=Book.objects.filter(name='红楼梦').values('authors__name')  | 
反向
1  | authors = Author.objects.filter(book__name= '红楼梦').values('name')  | 
查询红楼梦所有作者的名字对应其他书的名字
正向
1  | # 正向  | 
反向
1  | # 反向  | 
查询北京出版社出版过所有作者出版过的书籍的名字以及作者的名字
1  | books=Publish.objects.filter(name='北京出版社').values('book__authors__name','book__name')  | 
查询以12开头的作者出版过的所有书籍名字以及出版社的名字
通过AuthorDetail表开始查询
1  | ret=AuthorDetail.objects.filter(phone__startswith=12).values('author__book__name','author__book__publish__name')  | 
通过Book表开始查询
1  | ret=Book.objects.filter(authors__authordetail__phone__startswith=12).values('name','publish__name')  | 
django之on_delete
on_delete=None
1  | 删除关联表中的数据时,当前表与其关联的field的行为  | 
on_delete=models.CASCADE
1  | 级联删除  | 
on_delete=models.DO_NOTHING
1  | 删除关联数据,什么也不做  | 
on_delete=models.PROTECT
1  | 删除关联数据,引发错误ProtectedError  | 
on_delete=models.SET_NULL
1  | models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)  | 
on_delete=models.SET_DEFAULT
1  | models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')  | 
on_delete=models.SET
1  | # 删除关联数据,  |