当前位置: 首页 > news >正文

聚合查询, 分组查询,F查询,Q查询

一. 聚合查询

  aggregate()QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典。键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。如果你想要为聚合值指定一个名称,可以向聚合子句提供它。

from django.db.models import Avg, Max, Min, Count, Sum

    ret = models.Book.objects.all().aggregate(Avg('price'))
    ret = models.Book.objects.all().aggregate(a = Avg('price'))
    ret = models.Book.objects.all().aggregate(Avg('price'), Max('price'), Min('price'))
View Code

二. 分组查询

查询每个出版社出版了多少本书
    
    ret = models.Book.objects.values('publish').annotate(Count('id'))
    
    # < QuerySet[{'publish': 1, 'id__count': 1}, {'publish': 2, 'id__count': 2}, {'publish': 3, 'id__count': 2}] >
    
    查询每个出版社名称及出版了多少本书(3种方法)
    
    ret = models.Publish.objects.values('name').annotate(c=Count('book__id'))
    
    ret = models.Publish.objects.annotate(c=Count('book__id')).values('name','c')
        # < QuerySet[{'name': '人教出版社', 'c': 1}, {'name': '文艺出版社', 'c': 2}, {'name': '延河出版社', 'c': 2}, {'name': '中信出版社', 'c': 0}] >
    
    ret = models.Book.objects.values('publish__name').annotate(c=Count('id'))
        # < QuerySet[ {'publish__name': '人教出版社', 'c': 1}, {'publish__name': '文艺出版社', 'c': 2}, {'publish__name': '延河出版社', 'c': 2}] >
View Code

  练习

value得到的是一个QuerySet, 列表里面是字典
    value_list得到的是一个QuerySet, 列表里面是元祖
    正向查询和反向查询的结果可能不太一样

    1.统计每一个出版社的最便宜的书
    
    ret = models.Book.objects.values_list('publish__name').annotate(Min('price'))
    
    ret = models.Publish.objects.annotate(c=Min('book__price')).values_list('name','c')
    
    2.统计每一本书的作者个数
    
    ret = models.Book.objects.values('title').annotate(Count('authors'))
    
    4. 统计不止2个作者的图书
    
    ret = models.Book.objects.annotate(c=Count('authors')).filter(c__gt=2)
    
    5.根据一本图书作者数量的多少对查询集 QuerySet进行排序:
    
    ret = models.Book.objects.annotate(c=Count('authors')).order_by('c')
    
    6.查询各个作者出的书的总价格
    
    ret = models.Author.objects.values('name').annotate(c=Sum('book__price')).order_by('c')
View Code

三. F查询

  F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值。

  Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作。

  修改操作也可以使用F函数

查询评论数大于收藏数的书籍
    
    ret = models.Book.objects.filter(commentNum__gt=F('favoritesNum'))
    
    查询收藏数大于等于评论数2倍的书籍
    
    ret = models.Book.objects.filter(favoritesNum__gte=F('commentNum')*2)
    
    修改操作也可以使用F函数,比如将每一本书的价格提高5元:
    
    models.Book.objects.update(price=F('price')+5)
View Code

四. Q查询

  filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR 语句),你可以使用对象

  Q 对象可以使用&(与) 、|(或)、~(非) 操作符组合起来。当一个操作符在两个Q 对象上使用时,它产生一个新的Q 对象。

  你可以组合& 和|  操作符以及使用括号进行分组来编写任意复杂的Q 对象。同时,Q 对象可以使用~ 操作符取反,这允许组合正常的查询和取反(NOT) 查询:

查询张三或李四写的书
    
    ret = models.Book.objects.filter(Q(authors__name='张三')|Q(authors__name='李四')).distinct()
    
    ret = models.Book.objects.filter(Q(Q(authors__name='张三')|Q(authors__name='李四')) & ~Q(publishDate__year='2019')).values_list('title')
View Code

 

转载于:https://www.cnblogs.com/guyannanfei/p/10472536.html

相关文章:

  • [面试题记录01]实现一个function sum达到一下目的
  • 你和大神之间只差一个高效工具
  • 蓝桥——商标倒放
  • 05 面向对象之:类的成员
  • [古怪问题] Marshal.GetActiveObject 在管理员模式下无法正常运行
  • wind.print(); 打印的样式设置
  • 612.1.004 ALGS4 | Elementary Sorts - 基础排序算法
  • 读《构建之法》疑问
  • 如何设置linux支持上传的文件中文不乱吗
  • 致远慧图孙宇辉:出走英特尔的AI眼科野望
  • 为什么你设定的目标最后实现往往都会打折扣?
  • Golang数据结构
  • JSON 自学手册(图文教程)
  • 周工作总结-数据迁移
  • Bootstrap3基础 navbar 导航条 简单示例
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • JAVA多线程机制解析-volatilesynchronized
  • spring + angular 实现导出excel
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 解析 Webpack中import、require、按需加载的执行过程
  • 如何用vue打造一个移动端音乐播放器
  • 算法-插入排序
  • 译自由幺半群
  • mysql面试题分组并合并列
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #Lua:Lua调用C++生成的DLL库
  • (4)logging(日志模块)
  • (day6) 319. 灯泡开关
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (十八)SpringBoot之发送QQ邮件
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (学习日记)2024.02.29:UCOSIII第二节
  • (一)Linux+Windows下安装ffmpeg
  • .CSS-hover 的解释
  • .htaccess配置重写url引擎
  • .NET Core WebAPI中封装Swagger配置
  • .Net mvc总结
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 使用 ILMerge 合并多个程序集,避免引入额外的依赖
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .NET单元测试
  • .NET企业级应用架构设计系列之技术选型
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • @RequestBody与@ModelAttribute
  • [20181219]script使用小技巧.txt
  • [BT]BUUCTF刷题第8天(3.26)
  • [c++] 什么是平凡类型,标准布局类型,POD类型,聚合体
  • [codevs] 1029 遍历问题
  • [i.MX]飞思卡尔IMX6处理器的GPIO-IOMUX_PAD说明
  • [iOS]中字体样式设置 API