如何在Django中使用聚合的实现示例


Posted in Python onMarch 23, 2020

在本文中,我想向您介绍如何在Django中使用聚合,聚合的含义是“内容相关项的集合,以便它们可以显示或链接到”。在Django中,我们使用的情况例如:

用于在Django模型的数据库表中查找列的“最大值”,“最小值”。

用于基于列在数据库表中查找记录的“计数”。

用于查找一组相似对象的“平均值”值。

还用于查找列中的值的总和。

在大多数情况下,我们对数据类型为“整数”,“浮点数”,“日期”,“日期时间”等的列使用聚合。

本质上,聚合不过是对一组行执行操作的一种方式。在数据库中,它们由运算符表示为sum,avg等。执行这些操作Django在查询集中添加了两个新方法。

这两种方法是聚合和注释。我们也可以说,在sql中,aggregate是一个没有分组依据的操作(SUM,AVG,MIN,MAX),而annotate是在rowet_table.id上具有分组依据的操作。 (除非明确覆盖)。

让我们从新建一个工程开始:

#创建工程
django-admin startproject MyProject
#创建应用
python manage.py startapp Myapp

加应用到settings.py文件

INSTALLED_APPS = [
  'django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.messages',
  'django.contrib.staticfiles',
  'Myapp'  #newly added 
]

执行migrate命令:

python manage.py migrate

创建管理员用户:

python manage.py createsuperuser

打开Myapp下models.py文件,写入:

from django.db import models
 # Create your models here.
 
class Author(models.Model):
  name = models.CharField(max_length=50)
 
  def __str__(self):
    return self.name 
 
class Publisher(models.Model):
  name = models.CharField(max_length=50)
 
  def __str__(self):
    return self.name 
 
class Book(models.Model):
  name = models.CharField(max_length=300)
  price = models.DecimalField(max_digits=10, decimal_places=2)
  authors = models.ManyToManyField(Author)
  publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
 
  def __str__(self):
    return self.name

然后运行数据库迁移命令:

python manage.py makemigrations
python manage.py migrate

注册model到admin中,打开Myapp下admin.py文件,加入:

from django.contrib import admin
from .models import Book, Author, Publisher
 
# Register your models here.
 
admin.site.register(Book)
admin.site.register(Author)
admin.site.register(Publisher)

之后,您需要打开管理面板并将一些项目添加到数据库中。 之后,我们将启动聚合命令。

现在您需要打开django shell,因为我们将django shell用于我们的聚合命令。

运行命令:

python manage.py shell

1、查看总共有多少本书:

In [1]: from MyApp.models import Book
 
In [2]: Book.objects.count()
Out[2]: 8

2、查看某出版社下有多少本书?

In [5]: Book.objects.filter(publisher__name = 'Second')
Out[5]: <QuerySet [<Book: Python New Book>, <Book: Kotlin Book>]>

3、查看书的评价价格:

In [6]: from django.db.models import Avg
 
In [7]: Book.objects.all().aggregate(Avg('price'))
Out[7]: {'price__avg': Decimal('121.25')}

4、查看价格最贵的书价格:

In [8]: from django.db.models import Max
 
In [9]: Book.objects.all().aggregate(Max('price'))
Out[9]: {'price__max': Decimal('185')}

5、查看价格最便宜的书价格:

In [10]: from django.db.models import Min
 
In [11]: Book.objects.all().aggregate(Min('price'))
Out[11]: {'price__min': Decimal('50')}

6、所有书价格汇总:

In [12]: from django.db.models import Sum
 
In [13]: Book.objects.all().aggregate(Min('price'))
Out[13]: {'price__min': Decimal('50')}

7、混合使用:

In [5]: Book.objects.aggregate(Avg('price'), Max('price'), Min('price'))
Out[5]: 
{'price__avg': Decimal('121.25'),
 'price__max': Decimal('185'),
 'price__min': Decimal('50')}

8、annotate使用:

In [9]: from MyApp.models import Publisher
 
In [10]: from django.db.models import Count
 
In [11]: pubs = Publisher.objects.annotate(num_books=Count('book'))
 
In [12]: pubs[0].num_books
Out[12]: 3

到此这篇关于如何在Django中使用聚合的实现示例的文章就介绍到这了,更多相关Django使用聚合内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python数据可视化编程通过Matplotlib创建散点图代码示例
Dec 09 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
Jan 30 Python
python pandas中对Series数据进行轴向连接的实例
Jun 08 Python
利用Python如何生成便签图片详解
Jul 09 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
记录Python脚本的运行日志的方法
Jun 05 Python
pandas 选取行和列数据的方法详解
Aug 08 Python
python 申请内存空间,用于创建多维数组的实例
Dec 02 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
python 瀑布线指标编写实例
Jun 03 Python
在vscode中启动conda虚拟环境的思路详解
Dec 25 Python
python3注册全局热键的实现
Mar 22 #Python
浅谈Python线程的同步互斥与死锁
Mar 22 #Python
Django 项目布局方法(值得推荐)
Mar 22 #Python
python实现吃苹果小游戏
Mar 21 #Python
python实现贪吃蛇游戏源码
Mar 21 #Python
python实现微信打飞机游戏
Mar 24 #Python
Python类的动态绑定实现原理
Mar 21 #Python
You might like
PHP Squid中可缓存的动态网页设计
2008/09/17 PHP
JavaScript库 开发规则
2009/01/31 Javascript
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
jQuery EasyUI API 中文文档 - Pagination分页
2011/09/29 Javascript
JS实现CheckBox复选框全选全不选功能
2015/05/06 Javascript
使用vue.js开发时一些注意事项
2016/04/27 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
详解vue中computed 和 watch的异同
2017/06/30 Javascript
Angular 4.X开发实践中的踩坑小结
2017/07/04 Javascript
js实现弹出框的拖拽效果实例代码详解
2019/04/16 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
Python赋值语句后逗号的作用分析
2015/06/08 Python
Python函数式编程指南(一):函数式编程概述
2015/06/24 Python
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
python opencv旋转图像(保持图像不被裁减)
2018/07/26 Python
python 实现将多条曲线画在一幅图上的方法
2019/07/07 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
Python利用多线程同步锁实现多窗口订票系统(推荐)
2019/12/22 Python
python如何基于redis实现ip代理池
2020/01/17 Python
python序列类型种类详解
2020/02/26 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
利达恒信公司.NET笔试题面试题
2016/03/05 面试题
新闻网站实习自我鉴定
2013/09/25 职场文书
文科毕业生自荐书范文
2014/04/17 职场文书
本科生导师推荐信范文
2014/05/18 职场文书
法学专业毕业生求职信
2014/06/12 职场文书
师德师风学习材料
2014/12/19 职场文书
团队拓展训练感想
2015/08/07 职场文书
公务员的复习计划书,请收下!
2019/07/15 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书