Django ORM 之基于对象、双下划线查询
返回ORM目录 Django ORM
内容目录:
一、 基于对象的表查询
二、 基于双下划线的查询
三、 聚合查询 aggregate
四、 分组查询 annotate
一、 基于对象的表查询
- 1.正向查询 --> 意思是从含有外键表查询其外键对应的表的字段值 --> 正向查询容易推导
- (1)查询书籍是三国演义的出版社邮箱
- book_obj = models.Book.objects.filter(title='三国演义').first()
- 结果:123.qq.com
- (2)查询书籍是 活着 的作者的姓名
- book_obj = models.Book.objects.filter(title='活着').first()
- # print(book_obj.authors) # app01.Author.None 表示查询的数据有多个,需加上all()
- print(book_obj.authors.all())
- 结果:<QuerySet [<Author: 作者对象的名字:jason>]>
- (3)查询作者为jason电话号码
- user_obj = models.Author.objects.filter(name='jason').first()
- print(user_obj.authordetail.phone)
- 结果:1110
- 2.反向查询 --> 从外键不在本表开始查询对应关系表的数据 --> 相对要麻烦一点
- (1)查询出版社是南方出版社出版的书籍 一对多字段的反向查询
- # 首先要确定的是,书籍与南方出版社是有关系的,但是外键在书籍那边,
- # 从出版社开始查询数据,先得到出版社对象,在使用固定语法跨表到book表中,最后拿到数据。
- publish_obj = models.Publish.objects.filter(name='南方出版社').first()
- print(publish_obj.book_set) # app01.Book.None
- print(publish_obj.book_set.all())
-
- (2)查询作者jason写过的所有的书 多对多字段的反向查询
- author_obj = models.Author.objects.filter(name='jason').first()
- print(author_obj.book_set) # app01.Book.None
- print(author_obj.book_set.all())
-
- (3)查询作者电话号码是110的作者姓名 一对一字段的反向查询
- authordetail_obj = models.AuthorDetail.objects.filter(phone=110).first()
- print(authordetail_obj.author.name)
二、 基于双下划线的查询
- 1.正向查询
- (1) 查询书籍为三国演义的出版社地址
- res = models.Book.objects.filter(title='三国演义').values('publish__addr','title')
- (2) 查询书籍为活着的作者的姓名
- res = models.Book.objects.filter(title='活着').values("authors__name",'title')
- (3)查询作者为jason的家乡
- res = models.Author.objects.filter(name='jason').values('authordetail__addr')
- 2.反向查询
- (1)查询南方出版社出版的书名
- res = models.Publish.objects.filter(name='南方出版社').values('book__title')
- (2)查询电话号码为120的作者姓名
- res = models.AuthorDetail.objects.filter(phone=120).values('author__name')
- (3)查询作者为jason的写的书的名字
- res = models.Author.objects.filter(name='jason').values('book__title')
- (4)查询书籍为三国演义的作者的电话号码
- res = models.Book.objects.filter(title='三国演义').values('authors__authordetail__phone')
- (1)查询jason作者的手机号
- # 正向查询
- res = models.Author.objects.filter(name='jason').values('authordetail__phone')
- # 反向查询
- res = models.AuthorDetail.objects.filter(author__name='jason').values('phone')
-
- (2)查询出版社为东方出版社的所有图书的名字和价格
- # 正向查询
- res = models.Publish.objects.filter(name='东方出版社').values('book__title','book__price')
-
- # 反向查询
- res = models.Book.objects.filter(publish__name='东方出版社').values('title','price')
-
- (3)查询东方出版社出版的价格大于400的书
- # 正向查询
- res = models.Publish.objects.filter(name="东方出版社",book__price__gt=400).values('book__title','book__price')
- # 反向查询
- res = models.Book.objects.filter(price__gt=400,publish__name='东方出版社').values('title','price')
三、聚合查询 aggregate
- 1.需要先导包
- from django.db.models import Max,Min,Count,Sum,Avg
-
- 2.例子
- (1)查询所有书籍的作者个数
- res = models.Book.objects.filter(pk=3).aggregate(count_num=Count('authors'))
-
- (2)查询所有出版社出版的书的平均价格
- res = models.Publish.objects.aggregate(avg_price=Avg('book__price'))
-
- (3)统计东方出版社出版的书籍的个数
- res = models.Publish.objects.filter(name='东方出版社').aggregate(count_num=Count('book__id'))
-
四、分组查询 annotate
- 1.例子
- (1)统计每个出版社出版的书的平均价格
- res = models.Publish.objects.annotate(
- avg_price=Avg('book__price')).values('name','avg_price')
-
- (2)统计每一本书的作者个数
- res = models.Book.objects.annotate(
- count_num=Count('authors')).values('title','count_num')
- (3)统计出每个出版社卖的最便宜的书的价格
- res = models.Publish.objects.annotate(
- min_price=Min('book__price')).values('name','min_price')
- (4)查询每个作者出的书的总价格
- res = models.Author.objects.annotate(
- sum_price=Sum('book__price')).values('name','sum_price')
Django ORM 之基于对象、双下划线查询的更多相关文章
- Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...
- Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询
from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...
- django ORM模型表的一对多、多对多关系、万能双下划线查询
一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...
- 测试脚本配置、ORM必知必会13条、双下划线查询、一对多外键关系、多对多外键关系、多表查询
测试脚本配置 ''' 当你只是想测试django中的某一个文件内容 那么你可以不用书写前后端交互的形式而是直接写一个测试脚本即可 脚本代码无论是写在应用下的test.py还是单独开设py文件都可以 ' ...
- django models的点查询/跨表查询/双下划线查询
django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...
- python-day71--django多表双下划线查询及分组聚合及F/Q查询
#====================================双下划线的跨表查询===============# 前提 此时 related_name=bookList 属性查询: # 查 ...
- 五、Django学习之基于对象的跨表查询
五.Django学习之基于对象的跨表查询 正向与反向查询 关键在于ForeignKey字段写的位置.例如下面这段代码, 关系属性(字段)写在哪个类(表)里面,从当前类(表)的数据去查询它关联类(表)的 ...
随机推荐
- RabbitMQ使用(一)
1. 安装与使用 1. 激活 RabbitMQ's Management Plugin (前面跟绝对路径) "D:\娱乐\rabbitmq_server-3.6.5\sbin\rabbitm ...
- 3. 初识jmeter及JDK安装
jmeter 介绍 Apache JMeter™应用程序是开源软件,100%纯Java应用程序,旨在加载测试功能行为和测量性能.它最初是为测试Web应用程序而设计的,但后来扩展到其他测试功能. Jme ...
- Java jar文件
JAR(Java Archive)是基于ZIP文件格式的文件格式. 它用于捆绑Java应用程序或小程序的资源,类文件,声音文件,图像等. 它还提供数据压缩.一个JAR文件作为一种特殊类型的ZIP文件. ...
- layui的选项卡(tab)的问题
当页面打开单个tab时,操作栏显示: 当页面打开多个tab时,会发现操作栏与下面第一个tab显示的操作栏类型一样,并且操作栏的按钮无作用 第一个标签操作栏显示: 产生这样的原因:使用layui时,每个 ...
- gary's mod
第一题: class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print(Parent. ...
- 54-Ubuntu-打包压缩-4-bzip2压缩和解压缩介绍
bzip2 tar和bizp2命令结合可以实现文件打包和压缩 tar只负责打包,但不压缩 用bzip2压缩tar打包后的文件,其扩展名一般为xxx.tar.bz2 在tar命令有一个选项-j可以调用b ...
- 2018湘潭大学程序设计竞赛【E】
题目链接:https://www.nowcoder.com/acm/contest/105/E 题意:给你美食种类和查询次数,告诉你美味度和价格,给你固定钱数,问你最多能吃到多少美味度的食物.(X真是 ...
- 使用cpanel后台的“时钟守护作业”功能完成空间的定时全备份
现在不少虚拟主机都是使用的cpanel控制面板,由于空间商选用的cpanel版本不同,有的带有定时备份功能,而有的就没有这项功能,需要手动备份.不过,还在绝大部分的cpanel后台都有“时钟守护作业” ...
- GIT 部分记录
关于版本回退 git reset HEAD^ #回退a.py这个文件的版本到上一个版本 git reset HEAD^ a.py git reset HEAD a.py 我试了一下以上2种方式 ...
- js求三个数的最大值运算
js代码: <script> // var num1 = 32, // num2 = 43, // num3 = 98; // if (num1 > num2) { // if (n ...