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 ...
随机推荐
- [LeetCode] 252. Meeting Rooms 会议室
Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],...] (si ...
- ansys meshing划分无厚度的面
优酷播放地址: https://v.youku.com/v_show/id_XNDQ3MjAyODYzMg==.html?spm=a2hzp.8244740.0.0 原版视频教程下载地址: https ...
- python面试题第一份
阅读目录 1 Python的函数参数传递 2 Python中的元类(metaclass) 3 @staticmethod和@classmethod 4 类变量和实例变量 5 Python自省 6 字典 ...
- Rancher 部署 loonflow 工单系统
上篇文章介绍用实例主机部署:https://www.cnblogs.com/weavepub/p/11672305.html,本文采用Rancher上部署. 文章所有的文件都托管在Github:htt ...
- 通过JS下载 or 唤起App
判断唤起app的连接是否在WeChat中打开 let isWeiXin = navigator.userAgent.toLowerCase().indexOf('micromessenger') != ...
- DFRobot模块物联网演示项目整合
简介 本文是此次物联网项目的终结篇.本文将演示如何整合之前的文章中的模块和代码,来简单的完成一个物联网项目.最终的实现效果是:利用Iphone手机上的MQTTool App,来获取DHT11的温湿度数 ...
- [转帖]SQL Server 10分钟理解游标
SQL Server 10分钟理解游标 https://www.cnblogs.com/VicLiu/p/11671776.html 概述 游标是邪恶的! 在关系数据库中,我们对于查询的思考是面向集合 ...
- 【转】用VMware 8安装Ubuntu 12.04详细过程(图解)
图解演示环境版本: 本机系统: WIN7 虚拟机:VMware Workstation 8 (英文版) 安装目标:Ubuntu Desktop 12.04 LTS (请点击这里)先下载好iso镜像文 ...
- 前端学习:学习笔记(CSS部分)
前端学习:学习笔记(CSS部分) CSS的学习总结(图解) CSS的引入方式和书写规范 CSS的插入方式_内嵌样式 <!DOCTYPE html> <html> <hea ...
- Mysql系列(十一)—— 性能分析其他常用监控
show status show status可以查询显示出当前mysql server的状态信息.该语句不需要任何权限. 对于show status可以时用like子句,模糊检索需要的状态信息.如: ...