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 ...
随机推荐
- Spring Boot中整合Sharding-JDBC读写分离示例
在我<Spring Cloud微服务-全栈技术与案例解析>书中,第18章节分库分表解决方案里有对Sharding-JDBC的使用进行详细的讲解. 之前是通过XML方式来配置数据源,读写分离 ...
- 公司ES升级带来的坑怎么填?
前言 公司的ES最近需要全部进行升级,目的是方便维护和统一管理.以前的版本不统一,这次准备统一升级到一个固定的版本. 同时还会给ES加上权限控制,虽然都是部署在内网,为了防止误操作,加上权限还是有必要 ...
- java线程池模拟并发
public class CountDownLatchTest1 implements Runnable{ final AtomicInteger number = new AtomicInteger ...
- win10 配置IIS
互联网信息服务(英語:Internet Information Services),在台湾被称为网际网路资讯服务,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务.最初是W ...
- git自动提交脚本
每次在linux都要重新一遍一遍敲着这些重复的代码,我想着能够优化一下,做个一键脚本,减少重复劳动. #!/bin/bash git status read -r -p "是否继续提交? [ ...
- Canon MF113W激光打印机双面打印方法
系统:macOS 10.14.3 打印机:Canon MF113W 黑白激光打印机(不支持自动双面打印) 方法: 1)文件->打印->纸张处理->仅奇数页->倒序->打印 ...
- Spring Boot 静态页面跳转
本篇博客仅为自己提个醒:如何跳转页面而不麻烦控制器. 当我们创建 Spring Boot 项目时(勾选了 Thymeleaf 和 Web),目录结构会是如下: 其中图二是我创建了一个 h ...
- jQuery浮窗图片到页面中间的代码
jQuery浮窗图片到页面中间的代码 <!doctype html> <html> <head> <meta charset="utf-8" ...
- jquery-ajax请求.NET MVC 后台
在ajax的URL中写上"/你的控制器名/你方法名" 在后台控制器中对应有两个常用类型一个是ActionResult还有一个是JsonResult 在访问时需要在类型上加上publ ...
- JS删除指定下标的元素
在开发过程中,有时我们需要删除数组中某一下标的元素.JAVA中ArrayList有remove函数.但是在JavaScript中没有直接的删除方法.我们可以利用splice来实现.Array.spli ...