django orm 基于双下划线的跨表查询
一..基于双下划线的跨表查询(join实现)
key:正向查询按字段,反向查询按表明小写
1.一对多跨表查询
查询在跨表中可以有两种方式,正向查询就是关键字段在你要搜索的表,没有关键字段就是反向查询
跨表查询的显著特点是__双下划线,这道题中在你要找到name,但是Book中没有,通过正向查询关键字段+__来
跨表找到name
ret=Book.objects.filter(title="python").values("publish__name")
# print(ret)
ret=Publish.objects.filter(book__title="python").values("name")
print(ret) <QuerySet [{'name': '云南出版社'}]>
一对多
2 查询小瑞出版社出版的所有的书籍的名称
这道题中反向解析在出版社开始找,但是条件没有'小瑞',跨表寻找条件,
在filter条件先通过反向查询表名小写__+条件找到
ret=Book.objects.filter(publish__name="小瑞").values("title")
print(ret)
ret=Publish.objects.filter(name="小瑞").values("book__title")
print(ret)<QuerySet [{'book__title': 'linux'}, {'book__title': 'css'}]>
一对多反向跨表
2.多对多
3 查询python这本书籍的作者的年龄
在多对多的环境下,和一对多查询一样,是因为django是在太过强大,通过字段和表名小写
将多对多关系的三张表统统间接在一起,各取所需,
ret=Book.objects.filter(title="linux").values("authors__age")
print(ret)<QuerySet [{'authors__age': 18}, {'authors__age': 25}]>
ret=Author.objects.filter(book__title="linux").values("age")
print(ret)
多对多
4 查询alex出版过的所有的书籍名称
ret=Author.objects.filter(name="alex").values("book__title")
print(ret)<QuerySet [{'book__title': 'python5'}, {'book__title': 'linux'}, {'book__title': 'css'}]>
ret=Book.objects.filter(authors__name="alex").values("title")
print(ret)
多对多反向
3.一对一
5 查询alex的手机号
ret=Author.objects.filter(name="alex").values("ad__tel")
print(ret)<QuerySet [{'ad__tel': 123}]>
ret=AuthorDetail.objects.filter(author__name="alex").values("tel")
print(ret)
6 查询手机号为110的作者的名字
ret=AuthorDetail.objects.filter(tel="").values("author__name")
print(ret)<QuerySet [{'author__name': 'egon'}]>
ret=Author.objects.filter(ad__tel="").values("name")
print(ret)
一对一
聪明的你不难发现只要掌握了查询方式key,都是一样的
4.多个表单连续查询
1.查询小瑞出版社出版过的所有书籍的名字以及作者的姓名
这里可以通过表之间的关系逐步连成一张大表查询,注意的是连接时
是正向还是反向查询
ret=Publish.objects.filter(name="小瑞").values("book__title","book__authors__name")
print(ret)<QuerySet [{'book__title': 'linux', 'book__authors__name': 'alex'}, {'book__title': 'css', 'book__authors__name': 'alex'}, {'book__title': 'linux', 'book__authors__name': 'egon'}, {'book__title': 'css', 'book__authors__name': 'egon'}]>
ret=Author.objects.filter(book__publish__name="小瑞").values("name","book__title")
print(ret)
多次跨表查询
二>
聚合,分组
聚合与分组的区别是,聚合显示的是 aggregate 后面的结果,如
而分组后的结果往往是以all() 分组的话 ,前面不写values().如
一个个queryset对象列表,,需要values 来取出接轨
要是在values为条件分组的话,显示的是values()里面的条件和annotate后面的函数 组成键值对
要是在条件的后面写上了values(),按照具体要求分组,则是会是按你的要求分组
1.聚合
#聚合
#查询所有作者的平均年龄
#聚合分组前一定要引入模块,才会有效
from django.db.models import Avg,Max,Sum,Min,Count
# 查询坐着的平均年龄
# ret=Author.objects.aggregate(Avg("age"))
# print(ret){'age__avg': 21.6667}
# # 查询所有书籍的个数
# ret=Book.objects.aggregate(c=Count("title"))
# print(ret) {'c': 4}
聚合
2.分组
单表分组查询
这里的结果就是一个由title 与 c 组成的键值对
查询书籍表每一个出版社id以及对应的书籍个数
ret=Book.objects.values("title").annotate(c=Count(1))
print(ret)<QuerySet [{'title': 'python5', 'c': 1}, {'title': 'python', 'c': 1}, {'title': 'linux', 'c': 1}, {'title': 'css', 'c': 1}]>
# 查询每一个部门的名称以及对应员工的平均薪水
ret=Author.objects.values("name").annotate(a=Avg("age"))
print(ret)<Que
单表分组
跨表分组查询
在跨表分组中,可以在函数中使用跨表,也可以在后面的values()进行取键值对的跨表,和跨表查询一样
查询每一个出版社的名称以及对应的书籍平均价格
ret=Publish.objects.annotate(c=Avg("book__price")).values("book__title","book__price","email")
print(ret)<QuerySet [{'book__title': 'python5', 'book__price': Decimal('100.00'), 'email': ''}, {'book__title': 'python', 'book__price': Decimal('100.00'), 'email': ''}, {'book__title': 'linux', 'book__price': Decimal('100.00'), 'email': ''}, {'book__title': 'css', 'book__price': Decimal('150.00'), 'email': ''}]>
查询每一个作者的名字以及出版的书籍的最高价格
ret=Author.objects.values("name").annotate(c=Max("book__price"))
print(ret)<QuerySet [{'name': 'alex', 'c': Decimal('150.00')}, {'name': 'egon', 'c': Decimal('150.00')}, {'name': 'zero', 'c': None}]>
查询每一个书籍的名称以及对应的作者的个数
ret=Book.objects.values("pk").annotate(c=Count("authors"))
print(ret)
ret=Book.objects.annotate(c=Count("authors"))
print(ret)
4 查询作者数不止一个的书籍名称以及作者个数
ret=Author.objects.annotate(c=Count("book__title")).filter(c__gt=1).values("book__title","c")
print(ret)
ret=Book.objects.annotate(c=Count("authors__name")).filter(c__gt=1).values("title","c")
print(ret)<QuerySet [{'title': 'python5', 'c': 2}, {'title': 'linux', 'c': 2}, {'title': 'css', 'c': 2}]>
5 根据一本图书作者数量的多少对查询集 QuerySet进行排序
ret=Book.objects.annotate(c=Count("authors__name")).order_by("c")
print(ret)<QuerySet [<Book: Book object (2)>, <Book: Book object (1)>, <Book: Book object (4)>, <Book: Book object (3)>]>
6 统计每一本以py开头的书籍的名称以及作者个数
ret=Book.objects.annotate(c=Count("authors__name")).filter(title__startswith="py").values("title")
print(ret)
多表分组
3.F与Q
F是在filter中,比如说进行两个变量的比较,之类的用F函数
在这之前需要引入函数
from django.db.models import F,Q
from django.db.models import F,Q
# 查询评论数大于100的所有的书籍名称
ret=Book.objects.filter(count_num__gt=1000).values("title")
print(ret)
# 查询评论数大于2倍点赞数的所有的书籍名称
ret=Book.objects.filter(count_num__gt=F("poll_num"))
print(ret)
# 查询评论数大于2倍点赞数的所有的书籍名称
Book.objects.filter(count_num__gt=F("poll_num")*2)
ret = Book.objects.filter(Q(price__gt=300)|~Q(comment_count__gt=3000))
print(ret)
F函数
Q函数则是进行条件的判断时,比如价格>100或者地址在xxx"",通过比较的函数对比出来
& 和 |或 ~非
ret = Book.objects.filter(Q(price__gt=300)|~Q(comment_count__gt=3000))
print(ret)
django orm 基于双下划线的跨表查询的更多相关文章
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询
一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- Django学习——图书相关表关系建立、基于双下划线的跨表查询、聚合查询、分组查询、F查询、Q查询、admin的使用、使用脚本调用Django、Django查看源生sql
0 图书相关表关系建立 1.5个表 2.书籍表,作者表,作者详情表(垂直分表),出版社表,书籍和作者表(多对多关系) 一对一 多对多 本质都是一对多 外键关系 3.一对一的关系,关联字段可以写在任意一 ...
- Django Mysql数据库-基于双下划线的跨表查询
一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...
- (20)模型层 -ORM之msql 基于双下划线的跨表查询(一对一,一对多,多对多)
基于对象的跨表查询是子查询 基于双下划线的查询是连表查询 PS:基于双下划线的跨表查询 正向按字段,反向按表名小写 一对一 需求:查询lqz这个人的地址# 正向查询ret = models.Autho ...
- python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...
- (转)python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)
昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...
- $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)
自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...
随机推荐
- Sentinel Client: 整合Apollo规则持久化
在前面的学习过程中,Sentinel 的规则,也就是我们之前定义的限流规则,是通过代码的方式定义好的.这是初始化时需要做的事情,Sentinel 提供了基于API的方式修改规则: FlowRuleMa ...
- Visual Studio 2019(VS2019)正式版注册码秘钥
Visual Studio 2019 EnterpriseBF8Y8-GN2QH-T84XB-QVY3B-RC4DF Visual Studio 2019 ProfessionalNYWVH-HT4X ...
- jquery easyui datagrid 加载保存好的自定义设置的列属性
直接附上源代码 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...
- python笔记 利用python 自动生成条形码 二维码
1. ean13标准条形码 from pystrich.ean13 import EAN13Encoder encode = EAN13Encoder(') encode.save('d:/barco ...
- CentOS7安装图形化界面方法
一.linux安装(root用户操作) 1. 安装vncserver; yum install tigervnc-server 2. 安装vncviewer; yum install vnc 3. 设 ...
- 初次用R的实际案例数据分析
这是一次教授布置的期末作业,也是书籍<商务数据分析与应用>的一个课后作业 目录 数据描述 数据预处理 描述性统计分析 模型分析(方差分析) 数据描述 非学位职业培训机构的178个学员的数据 ...
- Java 线程的基本使用
GitHub Page: http://blog.cloudli.top/posts/Java-线程的基本使用/ 创建线程 创建线程的方式有两种: 继承 Thread 类 实现 Runnable 接口 ...
- 聊聊Lambda架构
定义 在数据分析场景中,我们可能会遇到这样的问题.例如,我们要做一个推荐系统,如果我们用批处理任务去做,一天或者一小时的推荐频次明显延迟太大.如果用流处理任务,虽然延迟的问题解决了,然而只用实时数据而 ...
- Spring+Mybatis动态切换数据源
功能需求是公司要做一个大的运营平台: 1.运营平台有自身的数据库,维护用户.角色.菜单.部分以及权限等基本功能. 2.运营平台还需要提供其他不同服务(服务A,服务B)的后台运营,服务A.服务B的数据库 ...
- ASP.NET Core中使用MialKit实现邮件发送
# 导包 首先我们需要导入 MailKit NuGet包,NuGet安装包命令在下方拓展介绍中. # 引用命名空间 using MailKit.Net.Smtp; using MimeKit; # 邮 ...