一..基于双下划线的跨表查询(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 基于双下划线的跨表查询的更多相关文章

  1. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  2. Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询

    一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...

  3. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

  4. Django学习——图书相关表关系建立、基于双下划线的跨表查询、聚合查询、分组查询、F查询、Q查询、admin的使用、使用脚本调用Django、Django查看源生sql

    0 图书相关表关系建立 1.5个表 2.书籍表,作者表,作者详情表(垂直分表),出版社表,书籍和作者表(多对多关系) 一对一 多对多 本质都是一对多 外键关系 3.一对一的关系,关联字段可以写在任意一 ...

  5. Django Mysql数据库-基于双下划线的跨表查询

    一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...

  6. (20)模型层 -ORM之msql 基于双下划线的跨表查询(一对一,一对多,多对多)

    基于对象的跨表查询是子查询 基于双下划线的查询是连表查询 PS:基于双下划线的跨表查询 正向按字段,反向按表名小写 一对一 需求:查询lqz这个人的地址# 正向查询ret = models.Autho ...

  7. python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)

    昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...

  8. (转)python 全栈开发,Day74(基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询)

    昨日内容回顾 # 一对多的添加方式1(推荐) # book=Book.objects.create(title="水浒传",price=100,pub_date="164 ...

  9. $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)

    自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...

随机推荐

  1. WEB前端开发职业学习路线初级完整版

    作者 | Jeskson 来源 | 达达前端小酒馆 下面小编专门为广大web前端开发职业者汇总了学习路线初级完整版,其实web前端开发工程师可算是高福利,高薪水的职业了,所以现在学习web前端开发的技 ...

  2. [LeetCode] 85. Maximal Rectangle 最大矩形

    Given a 2D binary matrix filled with 0's and 1's, find the largest rectangle containing only 1's and ...

  3. [LeetCode] 893. Groups of Special-Equivalent Strings 特殊字符串的群组

    You are given an array A of strings. Two strings S and T are special-equivalent if after any number ...

  4. java 声明并初始化字符串变量

    public class Sample { public static void main(String[] args) { String str = "Hello world"; ...

  5. java8 HashMap源码 详细研读

    HashMap原理 目的: 单纯分析和学习hashmap的实现,不多说与Hashtable.ConcurrentHashMap等的区别. 基于 jdk1.8 在面试中有些水平的公司比较喜欢问HashM ...

  6. 一篇了解大数据架构及Hadoop生态圈

    一篇了解大数据架构及Hadoop生态圈 阅读建议,有一定基础的阅读顺序为1,2,3,4节,没有基础的阅读顺序为2,3,4,1节. 第一节 集群规划 大数据集群规划(以CDH集群为例),参考链接: ht ...

  7. spring bean的三种管理方式·

    1.无参构造函数 1.xml文件配置内容 <!--无参构造函数--> <bean id="bean1" class="com.imooc.ioc.dem ...

  8. Salesforce学习之路(二)Profile

    如上篇文章所述,针对User来讲,最重要的概念便是Profile和Role,因为Profile于Security息息相关,这是一个合格的产品中十分重要的一环. 何为Profile? 前文所讲--就是一 ...

  9. 【转】Redis的各项功能解决了哪些问题?

    作者:Blackheart 出处:http://linianhui.cnblogs.com 先看一下Redis是一个什么东西.官方简介解释到:Redis是一个基于BSD开源的项目,是一个把结构化的数据 ...

  10. Markdown温故知新(2):详解七大标准语法

    1.标题 2.强调(粗体 & 斜体) 3.列表 4.链接 & 图片 5.代码块 6.引用 7.分割线 8.总结 说明:在 Markdown 中,一行是指由换行符或回车符之外的字符构成的 ...