如何在Django中使用聚合的实现示例

作者:mindg.cn 时间:2021-08-02 10:32:30 

在本文中,我想向您介绍如何在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

来源:https://www.mindg.cn/?p=2597

标签:Django,聚合
0
投稿

猜你喜欢

  • Python简单读写Xls格式文档的方法示例

    2021-11-02 13:27:30
  • asp中设置session过期时间方法总结

    2013-06-01 19:52:04
  • Python的面向对象编程方式学习笔记

    2021-02-02 07:00:30
  • python下setuptools的安装详解及No module named setuptools的解决方法

    2022-12-21 00:56:46
  • python提取字典key列表的方法

    2023-02-01 23:35:28
  • python去除空格,tab制表符和\\n换行符的小技巧分享

    2022-05-12 14:20:39
  • .NET反向代理组件YARP介绍

    2023-07-23 02:29:45
  • Python实现数据可视化看如何监控你的爬虫状态【推荐】

    2022-07-15 11:50:43
  • Python求两个文本文件以行为单位的交集、并集与差集的方法

    2021-12-25 09:12:18
  • 利用不同样式改变相同xhtml结构的布局

    2008-08-20 18:17:00
  • php小技巧之过滤ascii控制字符

    2023-10-03 05:13:15
  • 详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法

    2022-03-16 09:40:28
  • JavaScript监听触摸事件代码实例

    2023-08-20 19:12:54
  • jupyter notebook 重装教程

    2022-07-20 09:38:02
  • python中24小时制转换为12小时制的方法

    2023-01-26 20:50:12
  • 在go文件服务器加入http.StripPrefix的用途介绍

    2023-06-26 07:19:07
  • python包相关知识点之包的导入、相对路径以及绝对路径

    2023-08-11 11:09:46
  • python使用socket进行简单网络连接的方法

    2021-05-16 22:53:03
  • Python爬取用户观影数据并分析用户与电影之间的隐藏信息!

    2022-09-09 23:19:47
  • JavaScript 各种动画渐变效果

    2008-09-02 10:38:00
  • asp之家 网络编程 m.aspxhome.com