Django(10)ORM聚合查询(一)

简介: Django(10)ORM聚合查询(一)

Django版本:


>>> django.VERSION  
(4, 1, 0, 'final', 0)


PS:基于前几章的进度进行修改


一、聚合查询—aggregate()


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


Django使用聚合查询之前需要先从django.db.models引入Avg,Max,Min,Count,Sum,注意需要首字母大写

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

Avg:计算平均值


Max:最大值


Min:最小值


Count:统计出现的次数


Sum:和


聚合查询返回的值的数据类型是字典,而聚合函数aggregate()是QuerySet的一个终止子句,生成的一个汇总值,相当于count()函数。需要注意的是,使用aggregate()后,数据类型就变成了字典类型,不能再使用QuerySet数据类型的一些API了


日期数据类型DateField可以使用Max和Min


返回的字典中,键的名称默认是属性名称+__聚合函数名称,值是计算出来的聚合值,如果要自定义返回字典的键的名称,可以起别名,例如:

aggregate(别名 = 聚合函数名("属性名称"))
  • 实例,计算所有图书的平均价格
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.aggregate(Avg("price"))
    print(res,type(res))
    return HttpResponse("ok")

访问127.0.0.1:8000/add_book进行测试,观察终端输出,可以看到输出数据类型是字典


86208ada97634927a4b59d32d2836afe.png

d368e9518cc74635b76d748b647b787a.png


fb56ae4b04664243acd7744881e2b788.png


  • 计算所有图书的数量,价格的最大值和最小值
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.aggregate(c=Count("id"),max=Max("price"),min=Min("price"))
    print(res,type(res))
    return HttpResponse("ok")


  • 访问测试,查看终端输出


11764e9610b446acbb90b48c474392c1.png

a2b9f430c9034934b8f6a4c13c41dbce.png

5febaf9e16204c3693268b12c277b3ad.png

二、分组查询—annotate()


  • 分组查询同样也会用到聚合函数,同样先从django.db.models引入Avg,Max,Min,Count,Sum,注意需要首字母大写


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


  • 返回值:


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

如果使用Values_list取值,那么返回值则是QuerySet数据类型里的一个个元组


  • Mysql中的limit就相当于ORM中QuerySet数据类型的切片
  • 注意:


annotate里面存放聚合函数,其中:


values或values_list放在annotate前面:前面的values或values_list声明以什么字段分组,是字典还是元组,而annotate执行分组


values或values_list放在annotate后面:annotate表示直接以当前表的pk(主键)执行分组,后面的values或values_list表示查询哪些字段,==(也就是输出什么字段)==并且要将annotate里面的聚合函数起别名,在values或values_list中写它的别名


准备数据和创建模型


- models.py
# -*- coding: utf-8 -*-
from django.db import models
class Book(models.Model):
    title = models.CharField(max_length=32)   
    price = models.DecimalField(max_digits=5,decimal_places=2)  
    pub_date = models.DateField()
    publish = models.ForeignKey("Publish",on_delete=models.CASCADE)  #多对一
    authors = models.ManyToManyField("Author")  #多对多
class Publish(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=64)
    email = models.EmailField()
class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.SmallIntegerField()
    au_detail = models.OneToOneField("AuthorDetail",on_delete=models.CASCADE)  #一对一
class AuthorDetail(models.Model):
    gender_choices = (
        (0,"女"),
        (1,"男"),
        (2,"保密"),
    )
    gender = models.SmallIntegerField(choices=gender_choices)
    tel = models.CharField(max_length=32)
    addr = models.CharField(max_length=64)
    birthday = models.DateField()
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)


更新数据表


(test) PS F:\django\app1> python .\manage.py makemigrations app1_model
Migrations for 'app1_model':
  app1_model\migrations\0003_dep_emp_emps_remove_book_authors_remove_book_publish_and_more.py
    - Create model Dep
    - Create model Emp
    - Create model Emps
    - Remove field authors from book
    - Remove field publish from book
    - Delete model Author
    - Delete model AuthorDetail
    - Delete model Book
    - Delete model Publish
(test) PS F:\django\app1> python .\manage.py migrate app1_model
Operations to perform:
  Apply all migrations: app1_model
Running migrations:
  Applying app1_model.0003_dep_emp_emps_remove_book_authors_remove_book_publish_and_more... OK
  • 查看数据库,确认之前的表删除,刚刚新的表创建


05fc72e7565c460dac8a06cc1cec9808.png



  • 新建查询,写入


f5089e62399f440d858a8b46c54e9743.png


INSERT INTO app1_model_emp (id,name,age,salary,dep,province) VALUES ('1','令狐冲','24','6000.00','销售部','河南'); 
INSERT INTO app1_model_emp (id,name,age,salary,dep,province) VALUES ('2','任盈盈','18','8000.00','关公部','广东'); 
INSERT INTO app1_model_emp (id,name,age,salary,dep,province) VALUES ('3','任我行','56','10000.00','销售部','广东'); 
INSERT INTO app1_model_emp (id,name,age,salary,dep,province) VALUES ('4','岳灵珊','19','6000.00','关公部','河南'); 
INSERT INTO app1_model_emp (id,name,age,salary,dep,province) VALUES ('5','小龙女','20','8000.00','关公部','河北'); 
INSERT INTO app1_model_dep (id,title) VALUES ('1','销售部'); 
INSERT INTO app1_model_dep (id,title) VALUES ('2','关公部'); 
INSERT INTO app1_model_emps (id,name,age,salary,province,dep_id) VALUES ('2','令狐冲','24','8000.00','河南','1'); 
INSERT INTO app1_model_emps (id,name,age,salary,province,dep_id) VALUES ('3','任盈盈','18','9000.00','广东','2'); 
INSERT INTO app1_model_emps (id,name,age,salary,province,dep_id) VALUES ('4','任我行','57','10000.00','广东','1');
INSERT INTO app1_model_emps (id,name,age,salary,province,dep_id) VALUES ('5','岳灵珊','19','6000.00','河南','2');
INSERT INTO app1_model_emps (id,name,age,salary,province,dep_id) VALUES ('6','小龙女','20','8000.00','河北','2');

160f8bcd23434168a7de93a147b65946.png


  • 查看数据库信息


04b42fd102aa497ebf7255dd09fd6516.png

377a14f7a9554ea6a93d569aa6d5a877.png

ed07652472674f78b3abd23a1df9f7ec.png


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


# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Publish.objects.values("name").annotate(in_price = Min("book__price"))
    print(res)
    return HttpResponse("ok")


  • 访问测试,查看终端输出


033739134dcf488abf8f9837996e1e2c.png

bc43c304f8f14991be4bf64f6f551323.png

807b523c58944fcda39cf2a24376be13.png


统计每一本书的作者个数


# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
from django.db.models import Avg,Max,Min,Count,Sum
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    res = models.Book.objects.annotate(c = Count("authors__name")).values("title","c")  
    print(res)
    return HttpResponse("ok")

访问测试,查看终端输出


11cb69f0c1ac413f8a0658957b6996d6.png920deeb9abfb4248af1e220160262b78.png



目录
相关文章
|
3天前
|
Oracle 关系型数据库 MySQL
Django框架ORM操作(二)
Django框架ORM操作(二)
|
3天前
|
SQL 存储 前端开发
Django框架ORM操作(一)
Django框架ORM操作(一)
Django框架ORM操作(一)
|
7天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
9 0
|
5月前
|
SQL 数据库 开发者
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
|
17天前
|
SQL 缓存 数据库
Django ORM的性能优化:高效处理大量数据
【4月更文挑战第15天】本文介绍了优化Django ORM性能的六大技巧:1) 使用批量操作如bulk_create和bulk_update;2) 利用prefetch_related和select_related减少查询次数;3) 为常用字段添加索引;4) 优化数据库查询,避免循环查询;5) 使用缓存提升频繁查询性能;6) 在必要时使用原生SQL。这些策略能帮助处理大量数据时提升Django ORM的效率。
|
17天前
|
SQL 自然语言处理 数据库连接
Django ORM的魔力:简化数据库操作与迁移
【4月更文挑战第15天】Django ORM是Django框架的关键部分,提供了一种高级的面向对象方式与数据库交互,简化了手动SQL操作。通过定义Python数据模型,开发者能轻松创建数据库表结构,使用ORM执行查询、添加、修改和删除数据。Django ORM还自动化处理数据库连接、事务和数据类型转换。当模型变化时,Django的迁移工具帮助管理数据库结构的更新。通过这种方式,Django ORM促进了高效、专注于业务逻辑的Web开发。
|
17天前
|
SQL API 数据库
python的Django ORM框架深度解析
【4月更文挑战第14天】在Python的Web开发领域,Django无疑是一个备受推崇的框架。它提供了许多强大的工具和功能,使得开发者能够高效、快速地构建出高质量的Web应用。而在Django的众多特性中,ORM(对象关系映射)框架更是其不可或缺的一部分。本文将详细解析Django ORM框架,帮助读者更好地理解和使用它。
|
2月前
|
SQL API 数据库
一篇文章带你了解Django ORM操作
一篇文章带你了解Django ORM操作
20 0
|
5月前
|
Python
django orm 批量更新不同内容
网上存在很多相似文章,都是使用drf-extension,但是这个包其实只是批量更新的一种方法,就是全部更新一个内容,这完全不符合自己的需求。
26 1
|
9月前
|
SQL 数据库 Python