如何在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模拟新浪微博登陆功能(新浪微博爬虫)
Dec 24 Python
python处理圆角图片、圆形图片的例子
Apr 25 Python
对numpy和pandas中数组的合并和拆分详解
Apr 11 Python
django传值给模板, 再用JS接收并进行操作的实例
May 28 Python
Python实用技巧之利用元组代替字典并为元组元素命名
Jul 11 Python
对python周期性定时器的示例详解
Feb 19 Python
简单了解python中对象的取反运算符
Jul 01 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
Aug 10 Python
django中使用POST方法获取POST数据
Aug 20 Python
python匿名函数的使用方法解析
Oct 10 Python
python3.9实现pyinstaller打包python文件成exe
Dec 13 Python
Django路由层如何获取正确的url
Jul 15 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
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
通过PHP修改Linux或Unix口令的方法分享
2012/01/30 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
浅析php设计模式之数据对象映射模式
2016/03/03 PHP
PHP并发场景的三种解决方案代码实例
2021/02/27 PHP
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
javascript中2个感叹号的用法实例详解
2014/09/04 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
jquery轮播的实现方式 附完整实例
2016/07/28 Javascript
微信小程序实现图片预加载组件
2017/01/18 Javascript
JS实现页面打印功能
2017/03/16 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
2018/01/02 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
[03:58]兄弟们,回来开黑了!DOTA2昔日战友招募宣传视频
2016/07/17 DOTA
[05:31]干嘛呢兄弟!DOTA2 TI9语音轮盘部分出处
2019/05/14 DOTA
跟老齐学Python之有容乃大的list(4)
2014/09/28 Python
python实现将元祖转换成数组的方法
2015/05/04 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
Tensorflow实现在训练好的模型上进行测试
2020/01/20 Python
Django返回HTML文件的实现方法
2020/09/17 Python
Django自带用户认证系统使用方法解析
2020/11/12 Python
荷兰牛仔裤网上商店:Jeans Centre
2018/04/03 全球购物
证券期货行业个人的自我评价
2013/12/26 职场文书
优秀党支部书记事迹材料
2014/05/29 职场文书
2015年数学教研组工作总结
2015/05/23 职场文书
英语演讲开场白
2015/05/29 职场文书
安全温馨提示语大全
2015/07/14 职场文书
企业安全生产规章制度
2015/08/06 职场文书
Github 使用python对copilot做些简单使用测试
2022/04/14 Python
Nginx如何配置多个服务域名解析共用80端口详解
2022/09/23 Servers