如何在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网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
Jun 09 Python
python结合shell查询google关键词排名的实现代码
Feb 27 Python
使用Python脚本实现批量网站存活检测遇到问题及解决方法
Oct 11 Python
微信跳一跳python自动代码解读1.0
Jan 12 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
关于Python3 类方法、静态方法新解
Aug 30 Python
从numpy数组中取出满足条件的元素示例
Nov 26 Python
TensorFlow获取加载模型中的全部张量名称代码
Feb 11 Python
python logging设置level失败的解决方法
Feb 19 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
用Python爬虫破解滑动验证码的案例解析
May 06 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学习 运算符与运算符优先级
2008/06/15 PHP
php修改NetBeans默认字体的大小
2013/07/02 PHP
传递参数的标准方法(jQuery.ajax)
2008/11/19 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
js判断IE6/IE7/FF的代码[XMLHttpRequest]
2011/02/16 Javascript
jQuery Jcrop插件实现图片选取功能
2011/11/23 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
深入理解JavaScript系列(40):设计模式之组合模式详解
2015/03/04 Javascript
Jquery中的$.each获取各种返回类型数据的使用方法
2015/05/03 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
2015/08/21 Javascript
详解JavaScript for循环中发送AJAX请求问题
2020/06/23 Javascript
JS使用JSON作为参数实例分析
2016/06/23 Javascript
彻底学会Angular.js中的transclusion
2017/03/12 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
JS实现经典的中国地区三级联动下拉菜单功能实例【测试可用】
2017/06/06 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
2017/07/28 Javascript
Bootstrap Table 删除和批量删除
2017/09/22 Javascript
vue引用js文件的多种方式(推荐)
2018/05/17 Javascript
微信小程序如何获取用户收货地址
2018/11/27 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【凹多边形的分离轴检测算法】
2018/12/13 Javascript
微信小程序数据统计和错误统计的实现方法
2019/06/26 Javascript
详解BootStrap表单验证中重置BootStrap-select验证提示不清除的坑
2019/09/17 Javascript
javascript使用链接跨域下载图片
2019/11/01 Javascript
Python实现远程调用MetaSploit的方法
2014/08/22 Python
如何在python中使用selenium的示例
2017/12/26 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
一文了解python 3 字符串格式化 F-string 用法
2020/03/04 Python
python中的错误如何查看
2020/07/08 Python
Pycharm添加虚拟解释器报错问题解决方案
2020/10/13 Python
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
2015/10/13 面试题
设计毕业生简历中的自我评价
2013/10/01 职场文书
清明节寄语2015
2015/03/23 职场文书
请病假条范文
2015/08/17 职场文书