返回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 之基于对象、双下划线查询的更多相关文章

  1. Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...

  2. Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...

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

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

  4. django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询

    from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...

  5. django ORM模型表的一对多、多对多关系、万能双下划线查询

    一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...

  6. 测试脚本配置、ORM必知必会13条、双下划线查询、一对多外键关系、多对多外键关系、多表查询

    测试脚本配置 ''' 当你只是想测试django中的某一个文件内容 那么你可以不用书写前后端交互的形式而是直接写一个测试脚本即可 脚本代码无论是写在应用下的test.py还是单独开设py文件都可以 ' ...

  7. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  8. python-day71--django多表双下划线查询及分组聚合及F/Q查询

    #====================================双下划线的跨表查询===============# 前提 此时 related_name=bookList 属性查询: # 查 ...

  9. 五、Django学习之基于对象的跨表查询

    五.Django学习之基于对象的跨表查询 正向与反向查询 关键在于ForeignKey字段写的位置.例如下面这段代码, 关系属性(字段)写在哪个类(表)里面,从当前类(表)的数据去查询它关联类(表)的 ...

随机推荐

  1. Codeforces 1173B Nauuo and Chess

    题目链接:http://codeforces.com/problemset/problem/1173/B 思路参考:https://www.cnblogs.com/blowhail/p/1099123 ...

  2. tensorflow 训练网络loss突然出现nan的情况

    1.问题描述:开始训练一切都是那么的平静,很正常! 突然loss变为nan,瞬间懵逼! 2.在网上看了一些解答,可能是梯度爆炸,可能是有关于0的计算.然后我觉得可能是关于0的吧,然后进行了验证. 3. ...

  3. linux 编译指定库、头文件的路径问题(转)

    1. 为什么会出现undefined reference to 'xxxxx'错误? 首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得 ...

  4. spring boot下WebSocket消息推送

    WebSocket协议 WebSocket是一种在单个TCP连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范.WebSo ...

  5. docker 详细安装及问题排查

    一.安装docker 1.Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker . 通过 uname -r 命令查看 ...

  6. 面向连接的echo服务编程实例

    以下是echo_serv.c的源码,提供创建服务端,绑定套接字到本机IP的8080端口,当收到客户端发送的字符串就在屏幕上打印出来,并且把字符串发送给客户端 // echo_serv.c – gcc ...

  7. Vue之自建管理后台(三)登录页面

    在做登录页面之前,我们必须得完成路由的设定... 按照之前的设计我们路由的文件夹是src/router 官方默认的index.js,如下: import Vue from 'vue' import R ...

  8. (Struts2学习系列一)MyEclipse创建第一个struts2项目

    点击MyEclipse菜单栏File按钮,点击new-->Web Project 输入Project name之后点击Finish 项目创建完成. 然后右键项目,点击MyEclipse--> ...

  9. 从零开始搭建系统1.3——Tomcat安装及配置

    首先安装jdk,手动解压JDK的压缩包,然后设置环境变量 1.卸载自带openjdk 查询OpenJDK rpm -qa|grep java 批量卸载所有名字包含jdk的已安装程序.命令行: rpm  ...

  10. mysql 8+ 忘记root密码 解决方案

    在安装完数据库后,由于自己不小心直接关闭了安装窗口,或者长时间没有使用root用户登录系统,导致忘记了root密码,这时就需要重置MySQL的root密码.当然,最简单方式自然是删除数据库的data目 ...