如何在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操作mysql中文显示乱码的解决方法
Oct 11 Python
Django中的Signal代码详解
Feb 05 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
详解TensorFlow查看ckpt中变量的几种方法
Jun 19 Python
Django渲染Markdown文章目录的方法示例
Jan 02 Python
对Python中创建进程的两种方式以及进程池详解
Jan 14 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
Apr 09 Python
Python实现的微信支付方式总结【三种方式】
Apr 13 Python
如何使用pyinstaller打包32位的exe程序
May 26 Python
解决Python安装时报缺少DLL问题【两种解决方法】
Jul 15 Python
python实现通过队列完成进程间的多任务功能示例
Oct 28 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
May 20 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
摩卡咖啡
2021/03/03 咖啡文化
C#使用PHP服务端的Web Service通信实例
2014/04/08 PHP
php中实现记住密码下次自动登录的例子
2014/11/06 PHP
PHP 实现判断用户是否手机访问
2015/01/21 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
php+Ajax无刷新验证用户名操作实例详解
2019/03/04 PHP
javascript XML数据显示为HTML一例
2008/12/23 Javascript
基于jQuery的获取标签名的代码
2012/07/16 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
javascript 判断两个日期之差的示例代码
2015/09/05 Javascript
微信小程序 天气预报开发实例代码源码
2017/01/20 Javascript
xmlplus组件设计系列之按钮(2)
2017/04/26 Javascript
EasyUI中的dataGrid的行内编辑
2017/06/22 Javascript
基于input框覆盖掉数字英文的实例讲解
2017/07/21 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
[01:34]DOTA2 7.22版本新增神杖效果一览(敏捷英雄篇)
2019/05/28 DOTA
[41:13]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第一场 11.20
2020/11/20 DOTA
Selenium chrome配置代理Python版的方法
2018/11/29 Python
python生成requirements.txt的两种方法
2019/09/18 Python
Python求正态分布曲线下面积实例
2019/11/20 Python
python3 动态模块导入与全局变量使用实例
2019/12/22 Python
基于Python的一个自动录入表格的小程序
2020/08/05 Python
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
Clarks其乐鞋荷兰官网:Clarks荷兰
2019/07/05 全球购物
武汉英思工程科技有限公司&ndash;ORACLE面试测试题目
2012/04/30 面试题
应届生程序员求职信
2013/11/05 职场文书
护理专业自我鉴定
2014/01/30 职场文书
七一党日活动总结
2014/07/08 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
行风评议整改报告
2014/11/06 职场文书
自主招生自荐信范文
2015/03/04 职场文书
大学生村官工作总结2015
2015/04/09 职场文书
2015中学教师个人工作总结
2015/07/22 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
创业计划书之网吧
2019/10/10 职场文书