第五章、Django之模型层----多表查询

一、一对多字段增删改查

1.增

第一种
# models.Book.objects.create(title='三国演义',price=123.23,publish_id=1) # publish_id直接传出版社主键值
第二种
# publish_obj = models.Publish.objects.filter(pk=2).first()
# models.Book.objects.create(title='水浒传',price=123.23,publish=publish_obj) # publish直接传出版社数据对象

2.查

# book_obj = models.Book.objects.filter(pk=1).first()
# print(book_obj.publish) # 获取到当前所对应的出版社对象
# print(book_obj.publish_id) # 获取到的就是表中的实际字段

3.改

 # models.Book.objects.filter(pk=1).update(publish_id=3)
# publish_obj = models.Publish.objects.filter(pk=2).first()
# models.Book.objects.filter(pk=1).update(publish=publish_obj)

4. 删除

 # models.Publish.objects.filter(pk=2).delete()
# 默认也是级联更新 级联删除

二、多对多的增删改查

1. 增

 # 给主键为3的书籍添加两个作者 1 2
# book_obj = models.Book.objects.filter(pk=3).first()
# # print(book_obj.authors) # 就相当于 已经在书籍和作者的关系表了
# # book_obj.authors.add(1)
# # book_obj.authors.add(2,3)
# author_obj = models.Author.objects.filter(pk=1).first()
# author_obj1 = models.Author.objects.filter(pk=2).first()
# # book_obj.authors.add(author_obj)
# book_obj.authors.add(author_obj,author_obj1)
"""
add() 括号内既可以传数字也可以传数据对象
并且都支持传多个
"""

2. 改

第一种
# book_obj = models.Book.objects.filter(pk=3).first()
# # book_obj.authors.set([3,]) 原本有3的数据就不改动,会删除外键3以外的数据
# # book_obj.authors.set([1,3]) 原本有1和3的数据就不改动,会删除外键1和3以外的数据,
第二种
# author_obj = models.Author.objects.filter(pk=1).first()
# author_obj1 = models.Author.objects.filter(pk=2).first()
# book_obj.authors.set((author_obj,))
# book_obj.authors.set((author_obj,author_obj1))
"""
set() 括号内 既可以传数字也传对象
并且也是支持传多个的
但是需要注意 括号内必须是一个可迭代对象
"""

3. 删

 第一种
#book_obj = models.Book.objects.filter(pk=3).first()
# # book_obj.authors.remove(2) #删除由作者id=3写的书籍
# # book_obj.authors.remove(1,2) #删除由作者id=1和id=3写的书籍
第二种
# author_obj = models.Author.objects.filter(pk=1).first()
# author_obj1 = models.Author.objects.filter(pk=2).first()
# # book_obj.authors.remove(author_obj)
# book_obj.authors.remove(author_obj,author_obj1)
"""
remove() 括号内 既可以传数字也传对象
并且也是支持传多个的
"""
# 清空
# book_obj = models.Book.objects.filter(pk=3).first()
# book_obj.authors.clear()
"""clear()括号内不需要传任何参数 直接清空当前书籍对象所有的记录"""

三、ORM跨表查询

1.子查询
2.连表查询

四、正反向的概念

外键字段在谁那儿 由谁查谁就是正向

谁手里有外键字段 谁就是正向查
没有外键字段的就是反向
书籍对象 查 出版社 外键字段在书籍 正向查询
出版社 查 书籍 外键字段在书籍 反向查询 正向查询按字段
反向查询按表名小写 ...

1.基于对象的跨表查询 子查询


# 1.查询书籍是python入门的出版社名称
# book_obj = models.Book.objects.filter(title='python入门').first()
# # 正向查询按字段
# print(book_obj.publish.name)
# print(book_obj.publish.addr)
# 2.查询书籍主键是6的作者姓名
# book_obj = models.Book.objects.filter(pk=6).first()
# # print(book_obj.authors) # app01.Author.None
# print(book_obj.authors.all())
# 3.查询作者是jason的手机号
# author_obj = models.Author.objects.filter(name='jason').first()
# print(author_obj.author_detail.phone)
# print(author_obj.author_detail.addr)
"""
正向查询 按字段
当该字段所对应的数据有多个的时候 需要加.all()
否者点外键字段直接就能够拿到数据对象
"""

# 4.查询出版社是东方出版社出版过的书籍
# publish_obj = models.Publish.objects.filter(name='东方出版社').first()
# # print(publish_obj.book_set) # app01.Book.None
# print(publish_obj.book_set.all())
# 5.查询作者是jason写过的所有的书
# author_obj = models.Author.objects.filter(name='jason').first()
# # print(author_obj.book_set) # app01.Book.None
# print(author_obj.book_set.all())
# 6.查询手机号是110的作者
# author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
# print(author_detail_obj.author)
# print(author_detail_obj.author.name)
# print(author_detail_obj.author.age)
"""
反向查询按表名小写
什么时候需要加_set
当查询的结果可以是多个的情况下 需要加_set.all()
什么时候不需要加_set
当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可
"""
# 7.查询书籍是python入门的作者的手机号
# book_obj = models.Book.objects.filter(title='python入门').first()
# print(book_obj.authors.all())

2.基于双下划綫的跨表查询 连表查询

	"""
MySQL
left join
inner join
right join
union
"""
# 1.查询书籍是python入门的出版社名称
# 正向
# res = models.Book.objects.filter(title='python入门').values('publish__name')
# print(res)
# 反向
# res = models.Publish.objects.filter(book__title='python入门').values('name')
# print(res) # 2.查询作者是jason的手机号码
# 正向
# res1 = models.Author.objects.filter(name='jason').values('author_detail__phone')
# print(res1)
# 反向
# res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age')
# print(res)
# 3.查询手机号是120的作者姓名 # res2 = models.AuthorDetail.objects.filter(phone=120).values('author__name')
# print(res2)
# res = models.Author.objects.filter(author_detail__phone=120).values('name','author_detail__addr')
# print(res) # 4.查询出版社是东方出版社出版的书籍名称
# res = models.Publish.objects.filter(name='东方出版社').values('book__title','addr')
# print(res)
# 5.查询作者是jason的写过的书的名字和价格
# res = models.Author.objects.filter(name='jason').values('book__title','book__price')
# print(res) # 5.查询书籍是python入门的作者的手机号
# res = models.Book.objects.filter(title='python入门').values('authors__author_detail__phone')
# print(res)

第五章、Django之模型层----多表查询的更多相关文章

  1. 第五章、Django之模型层---单表操作

    目录 第五章.Django之模型层---单表操作 一.ORM查询 二.Django测试环境搭建 三.单表查询 1. 增 2. 改 3. 删 4. 查 第五章.Django之模型层---单表操作 一.O ...

  2. Django之模型层:表操作

    目录 Django之模型层:表操作 一.ORM简介 django测试环境搭建 Django终端打印SQL语句 二 单表操作 2.1 按步骤创建表 2.2记录 三.多表操作 1 创建模型 2 添加.删除 ...

  3. 06 Django之模型层---多表操作

    一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...

  4. Django之模型层-多表操作

    多表操作 数据库表关系 一对多:两个表之间的关系一旦确定为一对多,必须在数据多的表中创建关联字段 多对多:两个表之间的关系一定确定为多对多,必须创建第三张表(关联表) 一对一:一旦两个表之间的关系确定 ...

  5. Django之模型层-单表操作

    单表操作 添加记录 方式1 # 先实例化models中的对象,按照定义的语句规则传入参数,然后使用对象调用save()保存到数据库 book_obj = Book(id=1,title='python ...

  6. Python-Django 模型层-单表查询

    单表操作 -增加,删,改:两种方式:queryset对象的方法,book对象的方法 -改:需要用save() -get()方法:查询的数据有且只有一条,如果多,少,都抛异常 单表查询 -<1&g ...

  7. Python-Django 模型层-多表查询

    多表操作 基于对象的跨表查询(多次查询) 一对一: -正向查询按字段 -反向查询按表名小写 一对多: -正向查询按字段(正向查询一定会查出一个来) -反向查询按表名小写_set.all()(返回结果是 ...

  8. Python-Django 模型层-多表查询-2

    -related_name:基于双下划线的跨表查询,修改反向查询的字段 -related_query_name:基于对象的跨表查询,修改反向查询字段 publish = ForeignKey(Blog ...

  9. 05 Django之模型层---单表操作

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

随机推荐

  1. shell编程(2)

    一.变量简介 变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据.脚本语言在定义变量时通常不需要指明类型,直接赋值即可,shell变量也遵循这个规则. 在Bash shell 中,每一个 ...

  2. pyCharm最新2017激活

    pyCharm最新2017:下载地址 下载完成后安装软件 启动pyCharm,进入下面窗口 选择License server 在 server选项里边输入 http://elporfirio.com: ...

  3. windows10 企业版 安装应用商店

    安装windows10企业版后,提示 没有nvdia control panel 在其他位置下载均不成功 必须在win10自带的应用商店中安装,但win10企业版没有应用商店, 使用下方的网盘安装应用 ...

  4. Spring Security(20)——整合Cas

    整合Cas 目录 1.1           配置登录认证 1.1.1     配置AuthenticationEntryPoint 1.1.2     配置CasAuthenticationFilt ...

  5. iOS-在AFN基础上进行网络请求的封装

    网络请求的思路:如果请求成功的话AFN的responseObject就是解析好的. 1发送网络请求:get/post/或者别的 带上URL,需要传的参数 2判断后台网络状态码有没有请求成功: 3 请求 ...

  6. python、java、ruby、node等如何提取office文档中的内容?

    我相信大家都有过这样的需求,把doc.ppt.excel.pdf.txt中的文本内容提取出来.提取出来的文本内容可用于文档内容的全文索引,文档的基本内容摘要等.在度娘上搜索“如何提取文档内容”,确实有 ...

  7. mysql中单个字段包含','转换成多条记录

    问题:把value中的值取出作为另外一个表的where条件时,必须把value中的用','分隔的每一个id截取出来 解决方法: ),) ) #本文参考自网络某文章,非原创

  8. 终端复用器tmux基础使用

    简介对于经常操作Linux系统的同学来说,远程连接Linux服务器使用最多的工具是SecureCRT或者Xshell,而将此时的环境称为终端环境.Tmux是两个单词的缩写,即“Terminal Mul ...

  9. 【首发】uExitCode解释

    uExitCode 进程退出码,一般设置为0,不是的话也没有错误. 它的主要作用是,通知调用这个程序的其他程序退出的原因. 以前在dos下可能用的较多,现在windows下用的很少,而且windows ...

  10. springmvc 参数解析绑定原理

    handlerMethodArgumentResolver:方法参数解析器接口,这个接口是springmvc参数解析绑定的核心接口.不同的参数类型绑定都是通过实行这个接口来实现.也可以通过实现这个接口 ...