首页 > 其他分享 >Django丨聚合与分组查询

Django丨聚合与分组查询

时间:2023-02-21 03:00:17浏览次数:55  
标签:__ 聚合 models res price Django 分组 values 查询

聚合查询

聚合查询函数时对一组值执行计算,并返回单个值

Django使用聚合查询前要先从django.db.models引用Avg、Max、Min、Count、Sum(首字母大写)

from django.db.models import Avg, Max, Min, Count, Sum  #   引入函数

聚合查询返回值的数据类型是字典。

聚合函数aggregate()是QuerySet的一个终止子句,生成的一个汇总值,相当于count()。

使用aggregate()后,数据类型就变为字典,不能再使用QuerySet数据类型的一些API了。

返回的字典中:键的名称默认是(属性名称加上__聚合函数名),值是计算出来的聚合值

要自定义返回字典的键的名称,可以起别名:

aggregate(别名 = 聚合函数名("属性名称"))

实例

  • 计算所有图书的平均价格

from django.db.models import Avg, Max, Min, Count, Sum  #   引入函数
...
res = models.Book.objects.aggregate(Avg("price"))
print(res, type(res))
...
​
​
##### 输出 #####
{'price_avg': Decimal('200.000000')} <class 'dict'>
​
  • 计算所有图书的数量,最贵价格和最便宜价格

res=models.Book.objects.aggregate(c=Count("id"),max=Max("price"),min=Min("price"))

分组查询(annotate) 返回值:

分组后,用values取值,则返回值是QuerySet数据类型里面为一个个字典

分组后,用values_list取值,则返回是QuerySet数据类型里面为一个个元组

注:

annotate里面放聚合函数

values或者values_list放在annotate前面:values或者values_list是声明以什么字段分组,annotate执行分组。

values或者values_list放在annotate后面:annotate表示直接以当前表的pk执行分组,values或者values_list表示查询哪些字段,并且要将annotate里的聚合函数起别名,再values或者values_list里写起别名

创建模型

class Emp(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    salary = models.DecimalField(max_digits=8, decimal_places=2)
    dep = models.CharField(max_length=32)
    province = models.CharField(max_length=32)
​
class Emps(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    salary = models.DecimalField(max_digits=8, decimal_places=2)
    dep = models.ForeignKey("Dep", on_delete=models.CASCADE)
    province = models.CharField(max_length=32)
class Dep(models.Model):
    title = models.CharField(max_length=32)

 

注:省略导入数据步骤

实例

  • 统计每一个出版社的最便宜的书的价格

res = models.Publish.objects.values("name").annotate(in_price = Min("book__price"))
print(res)

##### 输出 #####
<QuerySet [{'name': '七月出版社', 'in_price': Decimal('100.00')}, {'name': '明教出版社', 'in_price': Decimal('300.00')}]>

  • 统计每一本书的作者个数

res = models.Book.objects.annotate(c = Count("authors__name")).values("title", "c")
print(res)
​

##### 输出 #####
<QuerySet [{'title': '七月人生', 'c': 1}, {'title': '吸星大法', 'c': 1}, {'title': '冲灵剑法', 'c': 1}]>


F()查询

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

之前构造的过滤器都只是将字段值与某个常量做比较,如果想要对两个字段的值做比较,就要用到F()。

使用之前需要先引用

from django.db.models import F

用法

F("字段名称")

F动态获取对象字段的值,可以进行运算

实例

  • 查询工资大于年龄的人

from django.db.models import F
...
book=models.Emp.objects.filter(salary__gt=F("age")).values("name", "age")
...
  • 将每一本书的价格提高100元

res = models.Book.objects.update(price=F("price")+100)

Q()查询

使用前需要先引入

from django.db.models import Q

用法

Q(条件判断)

之前构造的过滤器里的多个条件的关系是and,如果需要执行更复杂的查询(例如or语句),就可以使用Q。

Q对象可以使用 & | ~ (与或非)操作符进行组合

优先级从高到低:~ & |

可以混合使用Q对象和关键字参数,Q对象和关键字参数用”and“拼在一起的(即将逗号看成and)。

实例

  • 查询价格大于350或者名称以菜开头的书籍名称和价格

from django.db.models import Q

res = models.Book.objects.filter(Q(price__gt=350)|Q(title__startswith="菜")).values("title", "price")
  • 查询以“菜”结尾或者不是2010年10月份的书籍

from django.db.models import Q

res = models.Book.objects.filter(Q(title__endwith="菜"| ~Q(pub_date__year=2010)&Q(pud_date__month=10)))

 

  • 查询出版日期是2004或者1999年,并且书名中包含有”菜“的书籍

from django.db.models import Q

res = models.Book.objects.filter(Q(pub_date__year=2004) | Q(pub_date__year=1999), title__contains="菜")

注:Q 对象和关键字混合使用,Q 对象要在所有关键字的前面:

 

标签:__,聚合,models,res,price,Django,分组,values,查询
From: https://www.cnblogs.com/mengdie1978/p/17139563.html

相关文章

  • django的部署在centos
    虚拟环境#virtualenv是一个创建独立python环境的工具sudopipinstallvirtualenv#virtualenvwrapper将所有的虚拟环境统一管理,留意安装路径后面要用sudopipinstall......
  • Django模型 存列表
    在Django中存储列表的一个简单方法是将其转换为JSON字符串,然后将其保存为模型中的文本。然后,您可以通过将(json)字符串转换回python列表来检索该列表 ......
  • #Power Query 分组依据,数据的分类汇总
     一:概述 Power Query中的分组依据,类似于Excel中的分类汇总功能,可以按照某一分类对某列数据或某几列数据进行去重操作和聚合计算(求和、计数、求平均、非重复行计数等)......
  • springboot ElasticsearchRepository date_histogram 聚合查询
    NativeSearchQueryBuildernsqb=newNativeSearchQueryBuilder();DateHistogramAggregationBuilderdhb=AggregationBuilders.dateHistog......
  • Django数据库操作
    1、增#方式一category=models.Category(name='Python')#增加一条name是'Python'的一条数据category.save()#方式二models.Category.objects.create(name='Lin......
  • Django
    wsgirefwsgiref模块是内置模块,将请求的数据进行封装,组成键值对格式fromwsgiref.simple_serverimportmake_serverdefrun(env,response):''':paramen......
  • [django]drf入门004 过滤排序分页(转载)
    原文:https://pythondjango.cn/1.分页目录为什么要分页?DRF提供的分页类PageNumberPagination类LimitOffsetPagination类CursorPagination类函数类视图中使用分......
  • django中使用celery,模拟商品秒杀。
    Celery是Python开发的简单、灵活可靠的、处理大量消息的分布式任务调度模块 安装:pipinstallcelery#安装celery库pipinstallredis#celery依赖于......
  • 14.分组函数
    1.分组函数分组函数是操作一个分组的结果集,将行分组,按照组产生一个结果集,常用的分组函数有:avg,count,max,min,stddev,sum,variancehr@ORCLPDB012023-02-1915:58:03>selecta......
  • django修改认证模型类
    1.我在一个子应用下面创建了一个apps目录,且在apps下又创建了一个子应用users,结构如下图:2.在users的models.py中fromdjango.dbimportmodelsfromdjango.contrib.auth......