一..基于双下划线的跨表查询(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. Linux ssh 密钥创建与验证

    1.需要两个虚拟机,每一个创建一个用户登录到用户根下   2.每个用户都要创建密钥对   3.把两个用户的公用密钥用ssh-copy-id -i 命令将公用的密钥复制到另一个用户中   4.在客户端开 ...

  2. 洛谷P4593 [TJOI2018]教科书般的亵渎

    小豆喜欢玩游戏,现在他在玩一个游戏遇到这样的场面,每个怪的血量为\(a_i\)​,且每个怪物血量均不相同,小豆手里有无限张"亵渎".亵渎的效果是对所有的怪造成\(1\)点伤害,如果 ...

  3. 安装Oracle 11g时遇到“【INS-13001】此环境不满足最低配置”的问题解决

    一.问题如下: win10一般容易出现这个问题,可能是版本兼容的关系.  二.解决方法: 在Oracle 11g解压出的文件夹下寻找cvu_prereq.xml文件: 路径:database\stag ...

  4. 实战django(一)--(你也能看懂的)注册与登录(带前端模板)

    先是具体目录:(主要是注意templates和static的位置),其中person文件夹是上一期实战的,不用理会,login是本节实战app 项目urls.py from django.contri ...

  5. Qt 操作SQLite数据库

    项目中通常需要采用各种数据库(如 Qracle.SQL Server.MySQL等)来实现对数据的存储.查询等功能.下面讲解如何在 Qt 中操作 SQlite 数据库. 一.SQLite 介绍 Sql ...

  6. 学习《Linux网络安全技术与实现》,正文为1、2章的笔记,后面的等待更新

    博客地址:http://www.cnblogs.com/zengjianrong/p/3280276.html

  7. Installing Google Chrome in Linux(RedHat Enterprise Linux 7)

    # wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm # yum -y install r ...

  8. com.fasterxml.jackson.core.JsonGenerationException: Can not write a field name, expecting a value异常

    springboot对象返回,一直报生成json异常,经过检查,发现是自己在做xss防护时对出参进行了json的处理(copy代码不可取,囧) 异常信息 这里进行了出参处理了,但实际上只要对入参处理就 ...

  9. 【linux】【windows】查看你想访问的电脑Ip 和 端口是否 通畅

    常用查看IP是否通畅: 使用ping命令 ping 117.173.218.23 既想看IP又想看端口:使用telnet命令 telnet 117.173.218.23 9000 注意格式!!!

  10. 【转】Redis 分布式锁的正确实现方式( Java 版 )

    链接:wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/ 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布 ...