博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聚合查询, 分组查询,F查询,Q查询
阅读量:6115 次
发布时间:2019-06-21

本文共 2846 字,大约阅读时间需要 9 分钟。

一. 聚合查询

  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

你可能感兴趣的文章
程序员眼中的 SQL Server-执行计划教会我如何创建索引?
查看>>
【BZOJ】1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
查看>>
cmake总结
查看>>
数据加密插件
查看>>
linux后台运行程序
查看>>
win7 vs2012/2013 编译boost 1.55
查看>>
IIS7如何显示详细错误信息
查看>>
ViewPager切换动画PageTransformer使用
查看>>
coco2d-x 基于视口的地图设计
查看>>
C++文件读写详解(ofstream,ifstream,fstream)
查看>>
Android打包常见错误之Export aborted because fatal lint errors were found
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>
新手如何学习 jQuery?
查看>>
配置spring上下文
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
mysql-python模块编译问题解决
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
【Linux】linux经常使用基本命令
查看>>
Java 内存区域和GC机制
查看>>
更新代码和工具,组织起来,提供所有博文(C++,2014.09)
查看>>