如何在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


猜你喜欢
- 如果你有一堆 PPT 要做,他们的格式是一样的,只是填充的内容不一样,那你就可以使用 Python 来减轻你的负担。PPT 分为内容和格式,
- 最近有提关于下拉选项过多的时候,希望输入关键词,可以搜索内容的需求,但是之前项目太赶,所以也就没有来得及做,因为希望用原生js写一些内容,所
- 概述concurrent.futures 是 3.2 中引入的新模块,它为异步执行可调用对象提供了高层接口。可以使用 ThreadPoolE
- 希望这是window.open()打开fullscreen全屏窗口时无提示关闭父窗口的完美解决方案:我们通常都是用控件法,在父窗口文件里放一
- 在使用ORACLE的过程过,我们会经常遇到一些ORACLE产生的错误,对于初学者而言,这些错误可能有点模糊,而且可能一时不知怎么去处理产生的
- 本文实例讲述了JavaScript阻止浏览器返回按钮的方法。分享给大家供大家参考。具体分析如下:下面的JS代码可以阻止用户点击返回按钮,非常
- 首先我们知道python通过pip安装,那么我们安装的所有东西都会在我们pip下的配置目录下,这会显得非常臃肿,同样也让我们部署艰难。pyt
- 解决golang编译提示dial tcp 172.217.160.113:443: connectex: A connection atte
- 一 MySQL WorkbenchMySQL Workbench提供DBAs和developers一个集成工具环境:1)数据库设计和建模2)
- 引言本篇文章记录仿写一个el-collapse组件细节,从而有助于大家更好理解饿了么ui对应组件具体工作细节。本文是elementui源码学
- 目录一、Python GUI 编程简介二、流行GUI框架总结三、代码演示四、界面一、Python GUI 编程简介Tkinter 模块(Tk
- 前言本文简单总结了一下python中for循环的使用python中for循环一般用来迭代字符串,列表,元组等。当for循环用于迭代时不需要考
- 天气真的是越来越冷啦,有时候我们想翻看网页新闻,但是又冷的不想把手拿出来,移动鼠标翻看。这时候,是不是特别想电脑像讲故事一样,给我们念出来呢
- 目录1. 双向循环的练习2. break_pass_continue的使用3. for循环小提示:4. 小练习问题:答案:总结1. 双向循环
- 前言在我们使用线程池控制线程运行时,或者是写爬虫时不停发送request获取地址,都需要我们对运行的线程加以控制。有这样一种场景,当你写入一
- fuzzywuzzy 可以计算两个字符串之间的相似度,它依据 Levenshtein Distance 算法来进行计算。
- 本文实例讲述了Python实现监控键盘鼠标操作。分享给大家供大家参考,具体如下:# -*- coding: utf-8 -*-import
- 本文实例讲述了python中enumerate() 与zip()函数的使用比较。分享给大家供大家参考,具体如下:enumerate() 与z
- 在Bootstrap fileinput中移除预览文件时可以通过配置initialPreviewConfig: [ { url:'d
- 这是 2020 年第 3 个版本,也是最后一个版本。在 GoLand 2020.3 中,您可以探索 goroutines dumps,运行并