如何在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 相关文章推荐
Centos5.x下升级python到python2.7版本教程
Feb 14 Python
Python实现批量修改文件名实例
Jul 08 Python
分享6个隐藏的python功能
Dec 07 Python
python编程培训 python培训靠谱吗
Jan 17 Python
Python列表推导式、字典推导式与集合推导式用法实例分析
Feb 07 Python
详解Python静态网页爬取获取高清壁纸
Apr 23 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
Django 实现xadmin后台菜单改为中文
Nov 15 Python
python Plotly绘图工具的简单使用
Mar 03 Python
Python短信轰炸的代码
Mar 25 Python
python基于openpyxl生成excel文件
Dec 23 Python
Python实现批量自动整理文件
Mar 16 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
让你的网站首页自动选择语言转跳
2006/12/06 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
php设计模式 Facade(外观模式)
2011/06/26 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
ecshop 2.72如何修改后台访问地址
2015/03/03 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
2017/05/20 PHP
thinkphp3.2同时连接两个数据库的简单方法
2019/08/13 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
用jscript实现新建word文档
2007/06/15 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
Bootstrap实现弹性搜索框
2016/07/11 Javascript
JSON字符串和JSON对象相互转化实例详解
2017/01/05 Javascript
vue实现裁切图片同时实现放大、缩小、旋转功能
2018/03/02 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
Vue项目打包部署到apache服务器的方法步骤
2021/02/01 Vue.js
python选择排序算法实例总结
2015/07/01 Python
python好玩的项目—色情图片识别代码分享
2017/11/07 Python
使用python实现抓取腾讯视频所有电影的爬虫
2019/04/15 Python
python读取csv文件指定行的2种方法详解
2020/02/13 Python
PyQt5多线程防卡死和多窗口用法的实现
2020/09/15 Python
Bergfreunde丹麦:登山装备网上零售商
2017/02/26 全球购物
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
星空联盟C# .net笔试题
2014/12/05 面试题
医院搬迁方案
2014/06/14 职场文书
2014年中秋寄语
2014/08/11 职场文书
师德先进个人事迹材料
2014/12/19 职场文书
2015年中个人总结范文
2015/03/10 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
2015年为民办实事工作总结
2015/05/26 职场文书
主婚人致辞精选
2015/07/28 职场文书
食品安全主题班会
2015/08/13 职场文书
六五普法心得体会2016
2016/01/21 职场文书
PHP使用QR Code生成二维码实例
2021/07/07 PHP
详细了解java监听器和过滤器
2021/07/09 Java/Android
Netty分布式客户端处理接入事件handle源码解析
2022/03/25 Java/Android