聚合函数与F/Q表达式
聚合函数 取名: field + __ + 聚合函数名字 ,如:price__avg;可传关键字参数修改名字:avg=Avg("price");
aggregate:不会返回一个 QuerySet 对象,而是返回一个字典,key为聚合函数的名字,value为聚合函数执行结果;
annotate:返回一个 QuerySet 对象;
相同点:
- 都可执行聚合函数;可在任何的‘QuerySet’对象上调用,因此只要返回了‘QuerySet’对象,即可进行链式调用,如 index5 中获取年度销售总额,可先过滤年份再求聚合函数;
不同点:
- aggregate 返回一个字典,字典中存储聚合函数执行的结果;而 annotate 返回一个 QuerySet对象 ,并在查找的模型上添加一个聚合函数的属性;
- aggregate 不会做分组,而 annotate 会使用 Group by 字句进行分组,只有调用该字句才能对每一条数据求聚合函数的值;
- 数据库中的内容:
- models.py文件:
1 from django.db import models 2 3 class Author(models.Model): 4 '''作者模型''' 5 name = models.CharField(max_length=100) 6 age = models.IntegerField() 7 email = models.EmailField() 8 9 class Meta: 10 db_table = 'author' 11 12 class Publisher(models.Model): 13 '''出版社模型''' 14 name = models.CharField(max_length=300) 15 16 class Meta: 17 db_table = 'publisher' 18 19 class Book(models.Model): 20 '''图书模型''' 21 name = models.CharField(max_length=300) 22 pages = models.IntegerField() 23 price = models.FloatField() 24 rating = models.FloatField() 25 author = models.ForeignKey(Author,on_delete=models.CASCADE) 26 publisher = models.ForeignKey(Publisher,on_delete=models.CASCADE) 27 28 class Meta: 29 db_table = 'book' 30 31 class Bookorder(models.Model): 32 '''图示订单模型''' 33 book = models.ForeignKey('Book',on_delete=models.CASCADE) 34 price = models.FloatField() 35 create_time = models.DateTimeField(auto_now_add=True,null=True) 36 37 class Meta: 38 db_table = 'book_order'
- views.py文件:
1 from django.shortcuts import render 2 from django.http import HttpResponse 3 from .models import Author,Publisher,Book,Bookorder 4 from django.db.models import Avg,Count,Max,Min,Sum 5 from django.db import connection 6 7 def index(request): 8 # 获取所有图书定价的平均价(使用aggregate);Avg:平均值; 9 result = Book.objects.aggregate(Avg('price')) 10 print(result) 11 print(connection.queries) 12 return HttpResponse('index') 13 # >>>{'price__avg': 97.25} 14 # >>>{'price__avg': 97.25} 15 # {'sql': 'SELECT AVG(`book`.`price`) AS `price__avg` FROM `book`'; 16 17 def index2(requset): 18 # 获取每一本销售的平均价格(使用annotate); 19 books = Book.objects.annotate(avg=Avg('bookorder__price')) 20 for book in books: 21 print("%s:%s" % (book.name,book.avg)) 22 print(connection.queries) 23 return HttpResponse('index2') 24 #三国演义:89.33333333333333 25 # 水浒传:93.5 26 # 西游记:None 27 # 红楼梦:None 28 # `book_order` ON (`book`.`id` = `book_order`.`book_id`) GROUP BY `book`.`id` ORDER BY NULL'; 29 30 def index3(request): 31 # book 表中总共有多少本书; 32 # Count:求某个数据的的个数; 33 result = Book.objects.aggregate(nums=Count('id')) 34 # author 表中总共有多少个不同的邮箱; 35 # 使用‘distinct=True’剔除重复的值; 36 results = Author.objects.aggregate(book_num=Count('email',distinct=True)) 37 38 # 统计每本书的销量 39 books = Book.objects.annotate(book_nums=Count('bookorder')) 40 for book in books: 41 print("%s:%s" % (book.name,book.book_nums)) 42 print(books) 43 print(connection.queries) 44 return HttpResponse("index3") 45 # 三国演义:3 46 # 水浒传:2 47 # 西游记:0 48 # 红楼梦:0 49 50 51 def index4(request): 52 result = Author.objects.aggregate(max=Max('age'),min=Min('age')) 53 # 每本图书售卖前的最大及最小价格; 54 books = Book.objects.annotate(max=Max("bookorder__price"),min=Min("bookorder__price")) 55 for book in books: 56 print("%s:%s:%s" % (book.name,book.max,book.min)) 57 print(connection.queries) 58 return HttpResponse("index4") 59 60 # 三国演义:95.0:85.0 61 # 水浒传:94.0:93.0 62 # 西游记:None:None 63 # 红楼梦:None:None 64 65 66 def index5(request): 67 # 求所有图书的销售总额; 68 result = Book.objects.aggregate(total=Sum("price")) 69 print(result) 70 print(connection.queries) 71 # {'total': 389.0} 72 # {'sql': 'SELECT SUM(`book`.`price`) AS `total` FROM `book`', 'time': '0.001'}; 73 74 # 求每一本图书的销售总额; 75 books = Book.objects.annotate(total=Sum('bookorder__price')) 76 for book in books: 77 print("%s:%s" % (book.name,book.total)) 78 print(connection.queries) 79 # 三国演义: 268.0 80 # 水浒传: 187.0 81 # 西游记: None 82 # 红楼梦: None 83 84 85 # 求2018年度的销售总额; 86 result = Bookorder.objects.filter(create_time__year=2019).aggregate(total=Sum("price")) 87 # 求2018年度每一本图书的销售总额; 88 books = Book.objects.filter(bookorder__create_time__year=2019).annotate(total=Sum("bookorder__price")) 89 for book in books: 90 print("%s:%s" % (book.name,book.total) ) 91 print(connection.queries) 92 # 三国演义: 268.0 93 # 水浒传: 187.0 94 # `book_order`.`create_time` BETWEEN '2019-01-01 00:00:00' AND '2019-12-31 23:59:59.999999' GROUP BY `book`.`id`
- F表达式:动态获取某个字段上的值,不会真正到数据库中查询数据,只起一个标识的作用;
1 def index6(requset): 2 # 给每本书售价增加10元;update; 3 Book.objects.update(price=F('price')+10) 4 print(connection.queries[-1]) 5 # 'UPDATE `book` SET `price` = (`book`.`price` + 10)'; 6 7 # Author中name与email相同的内容; 8 authors = Author.objects.filter(name=F('emile')) 9 for author in authors: 10 print("%s:%s" % (author.name,author.email)) 11 return HttpResponse('index6')
- Q表达式:包裹查询条件,可在条件间进行多种操作:与 & 、或 | 、非 ~ 等查询操作;
1 def index7(requset): 2 # 1、获取价格大于100,评分大于4.5的图书; 3 # books = Book.objects.filter(price__gte=100,rating=4.5) 4 books = Book.objects.filter(Q(price__gte=100)&Q(rating__gte=4.5)) 5 for book in books: 6 print("%s:%s:%s" % (book.name,book.price,book.rating)) 7 8 --- 9 10 # 2、获取价格低于100,或者评分低于4.5分的图书; 11 books = Book.objects.filter(Q(price__lt=100)|Q(rating__lt=4.5)) 12 for book in books: 13 print("%s:%s:%s" % (book.name,book.price,book.rating)) 14 15 --- 16 17 # 3、获取价格大于100,并且图书名字不包含“传”字的图书; 18 books = Book.objects.filter(Q(price__gte=100)&~Q(name__icontains='传')) 19 for book in books: 20 print("%s:%s:%s" % (book.name,book.price,book.rating)) 21 return HttpResponse('index7')
转载于:https://www.cnblogs.com/liqiongming/p/10526911.html
聚合函数与F/Q表达式相关推荐
- 聚合和分组F,Q和事物,cookie,session
聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典. 键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函数的名称自动生成出 ...
- SQL 聚合函数中的数据过滤
文章目录 聚合函数中的 CASE 表达式 PostgreSQL/SQLite 中的 FILTER 选项 大家好!我是只谈技术不剪发的 Tony 老师. 今天给大家介绍一下如何在 SQL 聚合函数中进行 ...
- Django框架(12.Django中模型类高阶查询(Q对象以及F对象 和聚合函数查询))
Q对象 作用:用于查询时条件之间的逻辑关系.not and or,可以对Q对象进行 & | ~ 操作. & : 且 | : 或 ~ :非: 就 ...
- $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数
一.聚合函数 from django.db.models import Avg,Sum,Max,Min,Count,F,Q #导入 # .查询图书的总价,平均价,最大价,最小价 ...
- Django学习笔记(3):使用模型类进行查询(查询函数、F对象、Q对象、聚合函数、查询集、模型类关系、关联查询、自关联、管理器)
文章目录 1.查询函数 2.F对象 3.Q对象 4.聚合函数 5.Count函数 6.查询集 查询集的特性 对查询集进行切片 判断一个查询集中是否有数据 7.模型类之间的关系 一对多关系 多对多关系 ...
- Django Model各种操作 Meta 常用字段 一对多操作 多对对操作 F Q查询 聚合函数
Model操作 meta源信息 class CLS(models.Model):username = models.CharField(max_length=32)class Meta:db_tabl ...
- django 中的聚合函数,分组函数,F 查询, Q查询
先以mysql的语句,聚合用在分组里, 对mysql中groupby 是分组 每什么的时候就要分组,如 每个小组,就按小组分, group by 字段 having 聚合函数 #举例 :求班里的平均 ...
- Python全栈(十)Django框架之9.聚合函数和表达式
文章目录 一.聚合函数 1.Avg函数 2.聚合函数实现链式调用 3.aggregate和annotate的区别 4.Count函数 5.Max和Min函数 6.Sum函数 二.F表达式和Q表达式 1 ...
- Django的mode的分组查询和聚合查询和F查询和Q查询
1.聚合查询 # 聚合函数aggregate,求指定字段的最大值,最小值,平均值,和的值,方法如下from django.db.models import Avgfrom django.db.mode ...
最新文章
- Vim 命令、操作、快捷键全集
- Java面试宝典系列之基础面试题String、变量、类与对象、集合类、SSH(一)
- Tensorflow入门__实例:图计算
- BZOJ1078 [SCOI2008]斜堆 堆
- 【数据库】mysql常用的数据类型
- activereports_报表 ActiveReports 迎来 .Net Core 时代!一键创建 .Net Core 项目
- 读写自旋锁,第1部分(来自IBM)
- leetcode-Single Number II-137
- 这种div高度自适应确定你知道吗?
- Android通知栏Notification弹出横幅显示的解决方法
- 致远oa系统报价_用友致远OA 系统 一般价钱?(公司60-70台左右的电脑)
- Matlab实现均值滤波
- 国内外计算机专业图形图像处理课程现状,计算机图像处理论文
- 【Proteus仿真】51单片机+红外测距仪(GP2D12)+ADC0809模数转换
- 用Git在阿里云下克隆时出现“Please make sure you have the correct access rights and the repository exists”错误
- 互联网日报 | 瑞幸咖啡同意支付1.8亿美元达成和解;国产游戏海外收入首破千亿;滴滴试水信用支付...
- 性价比降噪耳机:NANK南卡降噪耳机和小米降噪耳机买哪个好?
- Discuz!x1.5实现在线文档(doc、ppt、pdf)播放
- 很猛很疯狂,北京楼市促销十年少见 房价下跌论渐占上风
- 《微信公众平台与小程序开发——从零搭建整套系统》——第1章,第1.2节微信公众平台...
热门文章
- windows下安装Python和安装Python解释器
- VSCODE 系列(一)VSCODE下载和安装
- Excel的规划求解实例
- 英语学习APP—百词斩
- locate用主动还是被动_女生在两性关系中,究竟是主动一点好,还是被动一点好?...
- vi和vt的区别小窍门_十大vi技巧和窍门
- 如何形成统一设计风格 - 实践篇
- 社区儿童计算机活动总结,幼儿园与社区活动总结
- 图文教程,Nginx+Keepalived(双机热备)介绍已经搭建高可用负载均衡环境
- 随手记获2亿美元C轮融资,随手记投资安全吗?