第十七篇 ORM跨表查询和分组查询---二次剖析
ORM跨表查询和分组查询---二次剖析
阅读目录(Content)
创建表(建立模型)
实例:我们来假定下面这些概念,字段和关系
作者模型:一个作者有姓名和年龄。
作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息。作者详情模型和作者模型之间是一对一的关系(one-to-one)
出版商模型:出版商有名称,所在城市以及email。
书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many);一本书只应该由一个出版商出版,所以出版商和书籍是一对多关联关系(one-to-many)。
模型建立如下:
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=)
age=models.IntegerField() # 与AuthorDetail建立一对一的关系
authorDetail=models.OneToOneField(to="AuthorDetail") class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True)
birthday=models.DateField()
telephone=models.BigIntegerField()
addr=models.CharField( max_length=) class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name=models.CharField( max_length=)
city=models.CharField( max_length=)
email=models.EmailField() class Book(models.Model): nid = models.AutoField(primary_key=True)
title = models.CharField( max_length=)
publishDate=models.DateField()
price=models.DecimalField(max_digits=,decimal_places=)
keepNum=models.IntegerField()<br> commentNum=models.IntegerField() # 与Publish建立一对多的关系,外键字段建立在多的一方
publish=models.ForeignKey(to="Publish",to_field="nid") # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
authors=models.ManyToManyField(to='Author')
基于对象的跨表查询
''''
一对多:
正向查询按字段
Book--------------->Publish
<---------------
反向查询按表名小写_set
'''''
一对多查询(Publish与Book)
正向查询按字段(看class里的publish = models.ForeignKey(to='Publish'))
# () 查询id为2的书籍对应出版社的邮箱
# Book.objects.filter(id=) 是 一个 queryset对象,
obj = Book.objects.filter(id=).first()
# 正向查询按字段
ret= obj.publish.email
filter 可以换成 get 但是get没有会报错
反向查询(按表名:book_set):
#() 沙河出版社出版过的所有的书籍的名字
obj = Publish.objects.filter(name='沙河出版社').first()
# 出版社找书籍 --反向查找
obj1 = obj.book_set.all().values("name")
'''
多对多:
正向查询按字段
Book--------------->Author
<---------------
反向查询按表名小写_set
反向查询按xxx
'''
多对多查询 (Author 与 Book)
正向查询(按字段:authors)
#()查询<涉哥开车来造>所有作者的名字 obj = Book.objects.filter(name='涉哥开车来造').first()
# 正向查询按字段
ret = obj.author.all().values('name')
反向查询(按表名:book_set)
#() 查询杨刚出版的书籍个数
obj=Author.objects.filter(name='杨刚').first()
# 出版社找书籍 --反向查找
ret = obj.book_set.all().count()
一对一查询(Author 与 AuthorDetail)
'''
一对一:
正向查询按字段
Book--------------->Author
<---------------
反向查询按表名小写 '''
正向查询按字段
# (5)查询杨刚的手机号
obj = Author.objects.filter(name='杨刚').first()
# 正向查询按字段
ret = obj.auther_detail.tele
反向查询按表名小写
#(6) 住在北京的作者的名字 obj = AuthorDetail.objects.filter(addr='北京').first()
# 反向查询按表名小写
ret = obj.author.name
print(ret)
注意:
你可以通过在 ForeignKey() 和ManyToManyField的定义中设置 related_name 的值来覆写 FOO_set 的名称。例如,如果 Article model 中做一下更改: publish = ForeignKey(Blog, related_name='bookList'),
基于双下划线的跨表查询
Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系。要做跨关系查询,就使用两个下划线来链接模型(model)间关联字段的名称,直到最终链接到你想要的 model 为止
关键点:正向查询按字段,反向查询按表名
# ()查询价格为111的书籍对应出版社的邮箱
obj = Book.objects.filter(price=).values('publish__email')
print(obj)
# () 沙河出版社出版过的所有的书籍的名字
obj1 = Publish.objects.filter(name='沙河出版社').values('book__author__name')
print(obj1)
# ()查询<涉哥开车来造>所有作者的名字
obj2 = Book.objects.filter(name='涉哥开车来造').values('author__name')
print(obj2)
# () 查询杨刚出版的书籍个数
obj3=Author.objects.filter(name='杨刚').values('book__name').count()
print(obj3)
# ()查询杨刚的手机号
obj4 = Author.objects.filter(name='杨刚').values('auther_detail__tele')
print(obj4)
# () 住在北京的作者的名字
obj5 = AuthorDetail.objects.filter(addr='北京').values('author__name')
print(obj5)
分组查询
多表查询
#(1) 每一个出版社的名字以及对应出版书籍个数
obj = Publish.objects.all().annotate(c=Count("book__name")).values("name","c")
print(obj)
# ()查询每一个作者的名字以及对应书籍的平均价格
obj1 = Author.objects.all().annotate(c=Avg('book__price')).values('name','c')
print(obj1)
# ()查询每一本书 的名字以及作者的个数
obj2 = Book.objects.all().annotate(c=Count("author")).values("name","c")
print(obj2)
单表查询
# 单表查询
ret = Book.objects.values("name").annotate(c=Count("*"))
print(ret)
第十七篇 ORM跨表查询和分组查询---二次剖析的更多相关文章
- Django【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)
django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); ...
- ORM单表查询,跨表查询,分组查询
ORM单表查询,跨表查询,分组查询 单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- Django之ORM跨表操作
Django之ORM表查询及添加记录 一.创建表 - 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-man ...
- 6月21日 Django ORM那些相关操作(表关联、聚合查询和分组查询)
一.ForeignKey操作 正向查找 对象查找(跨表) 语法: 对象.关联字段.字段 示例: book_obj = models.Book.objects.first() # 第一本书对象 pr ...
- 基于对象的跨表查询,多对多查询,多对多操作,聚合查询和分组查询,F查询和Q 查询
基于对象的跨表查询 一对多查询(班级表和学生表) 表结构创建 class Class(models.Model): id = models.AutoField(primary_key=True) cn ...
- Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...
- Web框架之Django_05 模型层了解(单表查询、多表查询、聚合查询、分组查询)
摘要: 单表查询 多表查询 聚合查询 分组查询 一.Django ORM 常用字段和参数: 常用字段:#AutoFieldint自增列,必须填入参数primary_key = True,当model中 ...
- Django进阶Model篇007 - 聚集查询和分组查询
接着前面的例子,举例聚集查询和分组查询例子如下: 1.查询人民邮电出版社出了多少本书 >>> Book.objects.filter(publisher__name='人民邮电出版社 ...
随机推荐
- Pytorch dataset自定义【直播】2019 年县域农业大脑AI挑战赛---数据准备(二),Dataset定义
在我的torchvision库里介绍的博文(https://www.cnblogs.com/yjphhw/p/9773333.html)里说了对pytorch的dataset的定义方式. 本文相当于实 ...
- 第1节 kafka消息队列:3、4、kafka的安装以及命令行的管理使用
6.kafka的安装 5.1三台机器安装zookeeper 注意:安装zookeeper之前一定要确保三台机器时钟同步 */1 * * * * /usr/sbin/ntpdate us.pool.nt ...
- IDEA配置数据库连接失败的问题
今天采用IDEA连接数据库失败了,有几个问题需要注意 首先笔者采用的数据库版本为8.0.17而IDEA自带版本是5.2.26大概,于是首先出现的问题是驱动不匹配,那么就需要换成我自己的版本,配置如下 ...
- Metasploit学习笔记——社会工程学
1.社会工程学攻击案例——伪装木马 Linux命令终端输入命令msfvenom -l payloads用来列出攻击载荷,grep命令用来查询所需要的攻击载荷,条件是windows系统.要有回连至监听主 ...
- 阿里云服务器win2003下iis整合tomcat共享80端口
阿里云服务器win2003下iis整合tomcat共享80端口 很多机器都用tomcat跟IIS部署不同网站.最近买了阿里云的服务器.于是也想玩一下.网上百度了很多方法.但是都有缺陷说的不是很清楚.通 ...
- ubuntu 怎么更新?ubuntu更新命令及方法
ubuntu 怎么更新?ubuntu更新命令及方法 安装Ubuntu系统后,第一件事就是更新系统源.由于系统安装的默认源地址在英国,作为Ubuntu的主源,国内连接速度非常慢,所以我们要将它换成就近的 ...
- du与df的区别
我们知道,磁盘的整体数据是记录在superblock中的,但是每一个文件的容量信息则在inode当中记载的.因此,引出了两个查看这些数据信息的命令: df:列出文件系统的整体磁盘使用量.由于df主要读 ...
- Windows驱动开发-设备读写方式
设备读写方式共三种: 方式 Flag 特点 缓冲区方式读写 DO_BUFFERED_IO I/O管理器先创建一个与用户模式数据缓冲区大小相等的系统缓冲区.而你的驱动程序将使用这个系统缓冲区工作.I/O ...
- Windows和linux命令行快捷键
Powershell的快捷键和cmd,linux中的shell,都比较像. ALT+F7 清除命令的历史记录 PgUp PgDn 显示当前会话的第一个命令和最后一个命令 Enter 执行当前命令 En ...
- Kubernetes Dashboard 【转】
前面章节 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户体验,Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 ...