1.django的多表查询 主要区分为: 正向查询    逆向查询

1. 多表查询: 是一个复杂的查询,他分为对象查询和__模糊查询两种方式

2. 多表查询: 又分为 一对一查询, 一对多查询, 多对多查询  三种方式

3. 多表查询: 分为正向查询 与 逆向查询,
正向查询 是根据 这个表中的外键属性名开始出发查询的跨表查询
逆向查询 是根据 根据关联表的 类名 小写 开始 进行跨表查询 4. 多表查询: 外键的存放位置如下:
# 一对多:出版社(一) 书籍(多,外键在多的一方,依赖于出版社)
# 一对一:作者详情(一) 作者(一,外键在任意一方均可,一旦外键放在作者中,作者依赖于作者详情)
# 多对多:作者(多)书籍(多)建立关系表(存放两个表的外键信息 => 将建表转化为关系对应字段 5. 多表查询: 逆向查询遇到多条结果,在类名后再添加_set

2. 一对多关系 的增:

# 主键操作
# publish = Publish.objects.create(name='小女孩出版社', address='山东')
# publish_id = publish.id
# Book.objects.create(name='死亡Python', price=66.66, publish_date='2018-8-8', publish_id=publish_id)
# 注意 publish_id = 其实就是publish表的id号进行匹配
# 对象操作
# publish = Publish.objects.first()
# Book.objects.create(name='圣斗士', price=888.88, publish_date='1970-1-1', publish=publish)

3.一对多关系 的 删除:

book = Book.objects.last()  # type: Book
#拿到书中的最后一个对象
book.delete()
#删除书对象
Publish.objects.first().delete()
#删除出版社的第一个对象

4. 一对多关系的 改操作:

publish_id = Publish.objects.last().id      #拿到对象的id号
Book.objects.filter(name='死亡Python').update(publish_id=publish_id)

5.一对一关系的 增加操作

# detail = AuthorDetail.objects.create(age=8, telephone=13766668888, info='一个字,帅')
# Author.objects.create(name="Owen", author_detail=detail)
# detail = AuthorDetail.objects.create(age=8, telephone=13766668888, info='一个字,帅')
# Author.objects.create(name="Liuxx", author_detail_id=detail.id) # 三句一起执行,两个作者使用一条详情,不满足唯一约束

6.一对一关系的 删除操作

AuthorDetail.objects.last().delete()

7. 多表的重难点  查询功能:

四:# 连表查询规则
# 1. 正向逆向概念:从存放外键的表到关系表称之为正向跨表查询,反之称之为逆向查询
# 2. 正向查询通过外键属性名进行跨表查询
# 3. 逆向查询通过关联表对应类名小写进行跨表查询 # 在连表查询规则规则之上,逆向查询遇到多条结果,在类名后再添加_set # 1、一对多表查询
# 需求:打印第一本书的出版社名
book = Book.objects.first()
print(book.publish.name)
# 注意这里book拿到的是对象 book 在通过外键属性名进行跨表出版社拿名字 # 需求:第一个出版社出版过的书们的名字,
publish = Publish.objects.first() #拿到的第一个出版社的对象
print(publish.book_set.all()) # 因为出版社有好多书 所有要_set
for book in publish.book_set.all(): # 在通过出版社 出版过的书们进行名字查询
print(book.name) # 需求:打印第二本书的出版社地址
address = Book.objects.all()[1].publish.address #运用了单表查询的切片功能
print(address)
# 这里也是正向查询, 通过书对象的外键属性名, 在publish表中的地址 # 需求:第二个出版社出版过的书们的价格
publish = Publish.objects.all()[1] # type: Publish
# 先拿到第二个出版社的对象
for book in publish.book_set.all(): # 第二个出版社出过的书们进行 精确查询
print(book.price) # 2、一对一关系的 表的查询
author = Author.objects.first() # type: Author
print(author.author_detail.telephone) author_detail = AuthorDetail.objects.last() # type: AuthorDetail
print(author_detail.author.name) # 3、多对多 表的关系查询
# 需求:第一本书的作者们的姓名
book = Book.objects.filter(name="圣斗士").first() # type: Book
# print(book.author)
for author in book.author.filter(name__endswith="xx"):
print(author.name) # 需求:第二个作者写过的书们的书名
author = Author.objects.all()[1] # type: Author
for book in author.book_set.all():
print(book.name) # 需求:第一个出版社出版过的书们的名字与价格
publish = Publish.objects.first()
books = publish.book_set.all() # 数据所有字段数据都被保留存放在对象(们)中
for book in books:
print(book.name, book.price) # 5、多级跨表查询
# 需求:第一个出版社出版过书们的作者们的电话号码
publish = Publish.objects.first() # type: Publish
#拿到的第一个出版社的对象
books = publish.book_set.all()
# 这个出版社出版过的书们
for book in books: # type: Book
authors = book.author.all() # type: Author
# 这本书的作者们
for author in authors: # type: Author
# 在通过作者进行信息查询
print(author.author_detail.telephone)

多表之连表查询

8. 多表查询难点, 基于双下划线的跨表查询功能实现:

 五. 基于双下划线的跨表查询:注:不能出现对象 ,
# 1、一对多
# 需求:第一本书的出版社名
# publish_name = Book.objects.filter(id=1).values('publish__name')
# print(publish_name) # 需求:第一个出版社出版过的书们,
# books_infos = Publish.objects.filter(id=1).values('book__name', 'book__price')
# print(books_infos) # 2、一对一
# 需求: 查询所有大于80岁作者的名字与实际年龄
# authors_infos = Author.objects.filter(author_detail__age__gt=80).values('name', 'author_detail__age')
# print(authors_infos) # 多级连表查询
# 多表关联:查询出版社在上海的出版过的所有书的 作者姓名、作者电话、具体出版社名 的相关信息
# infos = Publish.objects.filter(address__contains='上海').values('book__author__name', 'book__author__author_detail__telephone', 'name')
# print(infos)

双下划线查询方法

作业: 查询语句的用法

作业讲解::
# 地址在北京的出版社出版的书名 # books = Book.objects.filter(publish__address__contains='北京')
# for book in books:
# print(book.name) # 价格超过50元的书籍的出版社名
# publishs = Publish.objects.filter(book__price__gt=50).distinct()
# for p in publishs:
# print(p.name) # 获取所有名字里包含字母o(不区分大小写)作者的电话号码
# ads = AuthorDetail.objects.filter(author__name__icontains='o')
# for ad in ads:
# print(ad.telephone) # 年龄是20岁作者的作者名
# aus = Author.objects.filter(author_detail__age=20)
# for ad in aus:
# print(ad.name) # 获取第三位作者出版过的书的书名
# bs = Author.objects.all()[2].book_set.all()
# for b in bs:
# print(b.name) # 获取最后一本书作者们的简介
# aus = Book.objects.last().author.all()
# for au in aus: # type: Author
# print(au.author_detail.info) # 获取第一个出版社出版的最近一次出版的书的作者们的详情
# f_p = Publish.objects.first()
# print(f_p)
# f_p_bs = f_p.book_set.all()
# print(f_p_bs)
# f_p_bs_last = f_p_bs.order_by('publish_date').last()
# print(f_p_bs_last)
# aus = f_p_bs_last.author.all()
# print(aus)
#
# aus = Publish.objects.first().book_set.all().order_by('publish_date').last().author.all()
# for au in aus: # type: Author
# print(au.author_detail.info) # 获取地址在上海的出版社名,与出版过的书名
# res = Publish.objects.filter(address__contains='上海').values('book__name', 'name')
# print(res)
# 获取2018年出版的书名、书的价格与出版社名
# res = Book.objects.filter(publish_date__year=2018).values('name', 'price', 'publish__name')
# print(res) # 获取年龄小于20岁作者的名字、年龄、电话与简介
# res = AuthorDetail.objects.filter(age__lt=20).values('author__name', 'age', 'telephone', 'info')
# print(res) # 获取名字中包含e(不区分大小写)的作者出版过的书的书名与价格(需要去重)
# res = Author.objects.filter(name__icontains='e').values('book__name', 'book__price').distinct()
# print(res) # 获取书籍价格不超过50元的作者名与作者电话(需要去重)
# res = Book.objects.filter(price__lte=50).values('author__name', 'author__author_detail__telephone').distinct()
# print(res) # 获取在老男孩出版过书的年龄最大的作者的作者名、年龄、电话与简介
res = Author.objects.filter(book__publish__name__contains='老男孩').values('name', 'author_detail__age').order_by('author_detail__age').last()
print(res)

作业分析

Django 之多表查询 与多表的使用的更多相关文章

  1. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询   单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...

  2. firedac引擎DATASNAP多表查询和多表提交

    firedac引擎DATASNAP多表查询和多表提交 属性设置FDTableAdapter1.SchemaAdapter := FDSchemaAdapter;FDTableAdapter1.DatS ...

  3. MySQL之单表查询、多表查询

    一.单表查询: 单个表的查询方法及语法顺序需要通过实际例子来熟悉 先将表数据创建下: mysql> create database singe_t1; # 建个数据库singe_t1 Query ...

  4. [MySQL数据库之记录的详细操作:增、改、删、单表查询、多表查询]

    [MySQL数据库之记录的详细操作:增.改.删.单表查询.多表查询] 记录详细操作 增.删.改 增: insert t1(字段1,字段2,字段3) values (值1,值2,值3), (值1,值2, ...

  5. mysql表查询、多表查询(增强查询的使用)子查询、合并查询,外连接,mysql5种约束,自增长

    一.查询加强 1.在mysql中,日期类型可以直接比较,需要注意格式 2.%:表示0到多个字符, _:表示单个字符 exp:显示第二个字符为大写O的所有员工的姓名和工资 select  name fr ...

  6. Django中的跨表查询,多表查询。

    一:Django中的ORM进行操作. 必须掌握的十三条: <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 & ...

  7. Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)

    摘要: 单表查询 多表查询 聚合查询 分组查询 一.Django ORM 常用字段和参数: 常用字段:#AutoFieldint自增列,必须填入参数primary_key = True,当model中 ...

  8. mysql单表查询&&多表查询(职员表14+9)

    dept(deptno,dname,loc) emp(empno,ename,job,mgr,hiredate,sal,COMM,deptno) salgrade(grade,losal,hisal) ...

  9. sql多表查询(单表查询略过)

    表library: 表borrow: 表reader: 1.等值连接:(常用) 原理:将多张表组合成一个逻辑大表,即字段相加记录相乘(笛卡尔积). 语法:select * from 表A,表B whe ...

随机推荐

  1. Java 内存溢出(java.lang.OutOfMemoryError)情况总结

    最近做一个项目,因为分了十几个模块,但是每次在Eclipse中启动Tomcat必须加载四五个模块,这样出现了 java.lang.OutOfMemoryError 原因是Eclipse中Tomcat设 ...

  2. 限制input输入字符数(中文2个字符,英文1个字符)

    input的maxlength可以限制input的输入的字符数,但是是字符串的长度,相当于判断str.length;然而经常会有中文字符算2个字符英文算1个字符的需求,目前只能通过编写代码来实现. & ...

  3. bzoj5052: 繁忙的财政官

    求区间内相差最小的两个数的差 分sqrt(n)块,预处理两个数在块内,以及一个数在块内一个数在零散部分的情况,询问时归并排序处理两个数都在零散部分的情况,时间复杂度$O((n+q)\sqrt{n})$ ...

  4. Java学习——使用Static修饰符

    程序功能:通过两个类 StaticDemo.LX4_1 说明静态变量/方法与实例变量/方法的区别. package Pack1; public class Try { public static vo ...

  5. [UE4]更新Flag坐标

    UserWidget中也是有Event Tick事件,游戏运行每一帧都会调用这个事件 一.在MiniMapFlagData结构体中,添加Slot和ImageWidget变量 二.在StaticMini ...

  6. c#特性学习(1)

    C#中的特性我认为可以理解为Java中的注解,见名知意,就是描述这个类或是属性的一个信息,是一个语法糖.原理运用的是反射,下面我来演示一下它的原理.其中引用了软谋的代码. 举一个栗子.我们在做code ...

  7. 用juniversalchardet解决爬虫乱码问题

    爬虫往往会遇到乱码问题.最简单的方法是根据http的响应信息来获取编码信息.但如果对方网站的响应信息不包含编码信息或编码信息错误,那么爬虫取下来的信息就很可能是乱码. 好的解决办法是直接根据页面内容来 ...

  8. USACO 2008 Running(贝茜的晨练)

    [题解] 动态规划,dp[i][j]表示第i分钟疲劳度为j的最长距离. [代码] #include <iostream> #include <cstdlib> #include ...

  9. npm指南

    什么是 NPM npm 之于 Node ,就像 pip 之于 Python , gem 之于 Ruby , pear 之于 PHP . npm 是 Node 官方提供的包管理工具,他已经成了 Node ...

  10. asp.net 中日期的格式化显示的方法

    在Asp.net 中经常使用日期,在不同的场合,对日期的显示方式有不同的要求,为此,自己总结了一些日期格式化的方式,仅供学习参考使用: C#格式化日期时间 DateTime dt = DateTime ...