如何在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登陆asp网站页面的实现代码
Jan 14 Python
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
Apr 09 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
Jan 16 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
python实现图片处理和特征提取详解
Nov 13 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
解决Python安装后pip不能用的问题
Jun 12 Python
python递归实现快速排序
Aug 18 Python
python 接收处理外带的参数方法
Dec 03 Python
python批量创建指定名称的文件夹
Mar 21 Python
详解python中的数据类型和控制流
Aug 08 Python
Python内置异常类型全面汇总
May 28 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使用curl模拟登录后采集页面的例子
2013/11/04 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
PHP判断一个字符串是否是回文字符串的方法
2015/03/23 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
jquery 可排列的表实现代码
2009/11/13 Javascript
非主流的textarea自增长实现js代码
2011/12/20 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
纯js实现瀑布流展现照片(自动适应窗口大小)
2013/04/08 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
js实现当复选框选择匿名登录时隐藏登录框效果
2015/08/14 Javascript
Function.prototype.apply()与Function.prototype.call()小结
2016/04/27 Javascript
JavaScript关于提高网站性能的几点建议(一)
2016/07/24 Javascript
浅谈jquery中使用canvas的问题
2016/10/10 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
关于vue中的ajax请求和axios包问题
2018/04/19 Javascript
Vue模拟数据,实现路由进入商品详情页面的示例
2018/08/31 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
js 对象使用的小技巧实例分析
2019/11/08 Javascript
js实现小星星游戏
2020/03/23 Javascript
[52:40]完美世界DOTA2联赛PWL S2 Magma vs GXR 第一场 11.29
2020/12/02 DOTA
python的三目运算符和not in运算符使用示例
2014/03/03 Python
八大排序算法的Python实现
2021/01/28 Python
python之PyMongo使用总结
2017/05/26 Python
python实现BackPropagation算法
2017/12/14 Python
Python pandas RFM模型应用实例详解
2019/11/20 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
项目采购员岗位职责
2014/04/15 职场文书
安全生产标语
2014/06/06 职场文书
小学假期安全广播稿
2014/09/28 职场文书
不要在HTML中滥用div
2021/05/08 HTML / CSS