Django框架08 /聚合查询、分组、F/Q查询、原生sql相关

1. 聚合查询

  • aggregate(*args, **kwargs)

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

  • 代码示例:

    1. # 计算所有图书的平均价格
    2. >>> from django.db.models import Avg
    3. >>> Book.objects.all().aggregate(Avg('price'))
    4. # 结果:
    5. {'price__avg': 34.35}
    6. >>> Book.objects.all().aggregate(a=Avg('price')) # 或者给它起名字:aggretate(a=Avg('price'))
    7. # 结果:
    8. {'a': 34.35}
    9. >>> Book.objects.aggregate(average_price=Avg('price'))
    10. # 结果:
    11. {'average_price': 34.35}
  • 如果希望生成不止一个聚合,可以向aggregate()子句中添加另一个参数。

    例如:如果你也想知道所有图书价格的最大值和最小值,可以这样查询:

    1. >>> from django.db.models import Avg, Max, Min
    2. >>> Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
    3. # count('id'),count(1)也可以统计个数
    4. #结果:
    5. {'price__avg': 34.35, 'price__max': Decimal('81.20'), 'price__min': Decimal('12.99')}

2. 分组

  • annotate

  • 代码示例:

    1. models.Publish.objects.annotate(avg_price=Avg('book__price')).values('avg_price')
    2. # objects后面不写values默认是以id为依据分组
    3. models.Book.objects.values('publish_id').annotate(avg_price=Avg('price'))
    4. # objects后面写values,以values里边的字段为依据进行分组
    5. # 结果:
    6. # {'pulish_id':1,'avg_price':11.11}
    7. # 分组后排序:
    8. Book.objects.annotate(num_authors=Count('authors')).order_by('num_authors')
  • 注意:annotate里面必须写个聚合函数,不然没有意义,并且必须有个别名=,别名随便写,但是必须有,用哪个字段分组,values里面就写哪个字段,annotate其实就是对分组结果的统计,统计你需要什么。

3. F查询和Q查询

  • F查询 /针对自己单表中字段的比较和处理

    1. from django.db.models import F
    2. models.Book.objects.filter(good__gt=F('comment'))
    3. models.Book.objects.all().update(price=F('price')+100)
  • Q查询 /与& 或| 非~/针对多个条件的或与非进行查询

    1. from django.db.models import Q
    2. filter(Q(xx=11)|Q(ss=22)&Q(oo=33))
    3. filter(Q(Q(xx=11)|Q(ss=22))&Q(oo=33)) # &优先级高,先执行后面的&运算,再执行前面的|运算
    4. filter(Q(Q(xx=11)|Q(ss=22))&Q(oo=33),name='dd') # 逗号(,)隔开的话,优先级是先执行完前面的或(|),再执行逗号(,)后面的and关系

4. orm执行原生sql

  • 方式一:只能对本表进行原生sql操作

    1. models.Publish.objects.raw('原生sql')
    2. # <RawQuerySet: select * from app01_publish;>
    3. # 代码示例:
    4. def test(request):
    5. ret = models.Publish.objects.raw('select * from app01_publish;')
    6. for i in ret:
    7. print(i)
    8. return HttpResponse('Test is completed')
  • 方式二:对所有的表都可以进行原生sql操作

    1. from django.db import connection
    2. cursor = connection.cursor()
    3. cursor.execute(sql,[arg,]) # [arg,] -- 参数
    4. cursor.fetchall()
    5. # 代码示例:
    6. from django.db import connection
    7. cursor = connection.cursor()
    8. cursor.execute('select * from app01_publish;')
    9. print(cursor.fetchall())
    10. return HttpResponse('Test is completed')

5. 展示orm转换成原生sql语句

  • 显示orm语句转换成的原生sql语句

    1. models.Book.objects.filter(good__gt=F('comment')*2)
    2. from django.db import connection
    3. print(connection.queries)

6. 设置 sql_mode

  • 1.查看当前会话的sql_mode:

    1. select @@sql_mode
  • 2.设置当前会话的sql_mode:

    1. set @@sql_mode = 'only_full_group_by';
  • 3.设置全局会话的sql_mode:

    1. set global sql_mode = 'only_full_group_by';
  • 4.在配置文件中修改

7. orm查询示例

  • 代码示例:

    1. def test(request):
    2. from django.db.models import Max,Avg,Q
    3. # 1 查询每个作者的姓名以及出版的书的最高价格
    4. ret = models.Author.objects.annotate(max_price=Max('book__price')).values('name','max_price')
    5. print(ret)
    6. # 2 查询作者id大于2作者的姓名以及出版的书的最高价格
    7. ret = models.Author.objects.filter(id__gt=2).annotate(max_price=Max('book__price')).values('name','max_price')
    8. print(ret)
    9. # 3 查询作者id大于2或者作者年龄大于等于20岁的女作者的姓名以及出版的书的最高价格
    10. ret = models.Author.objects.filter(Q(id__gt=2)|Q(age__gte=20),sex='female').annotate(max_price=Max('book__price')).values('name','max_price')
    11. print(ret)
    12. # 4 查询每个作者出版的书的最高价格的平均值
    13. ret = models.Author.objects.annotate(max_price=Max('book__price')).aggregate(Avg('max_price'))
    14. print(ret)
    15. # 5 每个作者出版的所有书的最高价格以及最高价格的那本书的名称(orm查询会有问题)
    16. ret = models.Author.objects.annotate(a=Max('book__price')).values('a','book__title')
    17. print(ret)
    18. # 分组后取到的书名只有一个,取的都是每组的第一个
    19. # 原生sql查询
    20. # select * from
    21. # (select app01_author.id, app01_book.title, app01_book.price from app01_author
    22. # inner join app01_book_authors on app01_author.id=app01_book_authors.author_id
    23. # inner join app01_book on app01_book_authors.book_id=app01_book.id order by app01_book.price)
    24. # as t1 group by t1.id;
    25. return HttpResponse('Test is completed')
    26. # 注意点:
    27. # 1.as t1 是将查出来的一张虚拟表合并成一张表,里边有重复的字段合不成一张表(同一张表不能出现重复的字段),应该select出需要的字段,再合并成一张表
    28. # 2.分组是对新合成的t1表进行分组

Django框架08 /聚合查询、分组、F/Q查询、原生sql相关的更多相关文章

  1. Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询

    一:聚合,分组查询 二:F, Q查询

  2. 聚合查询、分组查询、F&Q查询

    一.聚合查询和分组查询 1.aggregate(*args, **kwargs): 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每个参数都指定一个包含在字典中的返回值 ...

  3. $Django 聚合函数、分组查询、F,Q查询、orm字段以及参数

        一.聚合函数    from django.db.models import Avg,Sum,Max,Min,Count,F,Q   #导入    # .查询图书的总价,平均价,最大价,最小价 ...

  4. django 中的聚合和分组 F查询 Q查询 事务cookies和sessions 066

    1 聚合和分组 聚合:对一些数据进行整理分析 进而得到结果(mysql中的聚合函数) 1aggregate(*args,**kwargs) : 通过对QuerySet进行计算 ,返回一个聚合值的字典. ...

  5. 聚合和分组F,Q和事物,cookie,session

    聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典. 键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函数的名称自动生成出 ...

  6. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

  7. orm中的聚合函数,分组,F/Q查询,字段类,事务

    目录 一.聚合函数 1. 基础语法 2. Max Min Sum Avg Count用法 (1) Max()/Min() (2)Avg() (3)Count() (4)聚合函数联用 二.分组查询 1. ...

  8. Django ORM (四) annotate,F,Q 查询

    annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合. from django.shortcuts import re ...

  9. 分组\聚合\F\Q查询

    一.分组和聚合查询 1.aggregate(*args,**kwargs)  聚合函数 通过对QuerySet进行计算,返回一个聚合值的字典.aggregate()中每一个参数都指定一个包含在字典中的 ...

随机推荐

  1. 使用Apache Spark和Apache Hudi构建分析数据湖

    1. 引入 大多数现代数据湖都是基于某种分布式文件系统(DFS),如HDFS或基于云的存储,如AWS S3构建的.遵循的基本原则之一是文件的"一次写入多次读取"访问模型.这对于处理 ...

  2. (三)log4j常用配置

    控制台(console) log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = ...

  3. 12.DRF-节流

    Django rest framework源码分析(3)----节流 添加节流 自定义节流的方法 限制60s内只能访问3次 (1)API文件夹下面新建throttle.py,代码如下: # utils ...

  4. 性能测试之JVM的故障分析工具VisualVM

    VisualVM 是随JDK一同发布的jvm诊断工具,通过插件可以扩展很多功能,插件扩展也是其精华所在. 提供了一个可视界面,用于在Java应用程序在Java虚拟机上运行时查看有关Java应用程序的详 ...

  5. 乌班图设置C++11

    zsh: echo "alias g++='g++ -std=c++11'" >> ~/.zshrc  source ~/.zshrc bash: echo " ...

  6. 修改Git远程地址 git config remote.origin.url "https://..."

    仓库管理: 添加或指定远程仓库地址 git remote set-url origin "https://..." git config remote.origin.url &qu ...

  7. weui上传多图片,前端压缩,base64编码

    记录一下在做一个报修功能的心路历程,需求功能很简单,一个表单提交,表单包含简单的文字字段以及图片 因为使用的是weui框架,前面的话去找weui的表单和图片上传组件,说实话,weui的组件写的还不错, ...

  8. Python数据可视化实战:实时更新海外疫情数据,实现数据可视化

    前言 我国的疫情已经得到了科学的控制,开始了全面的复工复产,但是国外的疫情却“停不下来”.国外现在可谓就是处于水深火热当中啊,病毒极强的传染性,导致了许多的人都“中招”了,我国已经全面复工复产了,人大 ...

  9. Python 简明教程 --- 20,Python 类中的属性与方法

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 与客户保持良好的关系可以使生产率加倍. -- Larry Bernstain 目录 类中的变量称为属 ...

  10. 【秒懂Java】【第1章_初识Java】04_学习资料

    为了学到更多的新知识,我们经常会去网上搜索各种学习资料.或者,在学习.工作过程中遇到了解决不了的问题,我们也会去网上搜索答案(比如百度.谷歌一下).这篇文章,主要想跟大家聊聊关于学习资料的选择. 建议 ...