如何在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 17 Python
简化Python的Django框架代码的一些示例
Apr 20 Python
python中字符串前面加r的作用
Jun 04 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
Python不使用int()函数把字符串转换为数字的方法
Jul 09 Python
python3使用pandas获取股票数据的方法
Dec 22 Python
python+Django+pycharm+mysql 搭建首个web项目详解
Nov 29 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
Jun 01 Python
Python爬取网页信息的示例
Sep 24 Python
Python 可视化神器Plotly详解
Dec 26 Python
解决numpy数组互换两行及赋值的问题
Apr 17 Python
Pytorch使用shuffle打乱数据的操作
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
正义联盟的终局之战《天启星战争》将成为DC动画宇宙的最后一部
2020/04/09 欧美动漫
如何做到多笔资料的同步
2006/10/09 PHP
基于PHP CURL获取邮箱地址的详解
2013/06/03 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
PHP浮点比较大小的方法
2016/02/14 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
JS 页面内容搜索,类似于 Ctrl+F功能的实现代码
2007/08/13 Javascript
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
javascript document.compatMode兼容性
2010/02/23 Javascript
js修改table中Td的值(定义td的单击事件)
2013/01/10 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
jQuery实现MSN中文网滑动Tab菜单效果代码
2015/09/09 Javascript
JS原型对象的创建方法详解
2016/06/16 Javascript
原生js实现键盘控制div移动且解决停顿问题
2016/12/05 Javascript
react开发中如何使用require.ensure加载es6风格的组件
2017/05/09 Javascript
使用淘宝镜像cnpm安装Vue.js的图文教程
2018/05/17 Javascript
js实现简易计算器功能
2019/10/18 Javascript
基于vue-cli3+typescript的tsx开发模板搭建过程分享
2020/02/28 Javascript
[01:10]DOTA2次级职业联赛 - Fly战队宣传片
2014/12/01 DOTA
python如何实现excel数据添加到mongodb
2015/07/30 Python
使用Python编写简单的画图板程序的示例教程
2015/12/08 Python
Python实现FTP弱口令扫描器的方法示例
2019/01/31 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
python如何基于redis实现ip代理池
2020/01/17 Python
JAVA SWT事件四种写法实例解析
2020/06/05 Python
python对 MySQL 数据库进行增删改查的脚本
2020/10/22 Python
Eton丹麦官网:精美的男式衬衫
2020/05/27 全球购物
高中生自我鉴定范文
2013/10/30 职场文书
餐饮业的创业计划书范文
2013/12/26 职场文书
家具商场的活动方案
2014/08/16 职场文书
安全生产标语大全
2014/10/06 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书
2015年食堂工作总结报告
2015/04/23 职场文书
刑事上诉状范文
2015/05/22 职场文书
安全生产培训心得体会
2016/01/18 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL