Django聚合与注释实战:从基础概念到代码实现

慢慢来
慢慢来
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析Django中的聚合(Aggregate)与注释(Annotate)机制。通过新建Django项目、定义模型及注册Admin,演示如何配置环境。重点讲解如何使用Aggregate进行最大值、最小值、平均值、总和及计数的查询,并结合Annotate实现分组统计。提供完整的Shell操作示例,涵盖单值聚合与混合查询,帮助开发者高效处理数据库统计需求。

Django聚合与注释基础概念

本文将介绍如何在Django框架中运用聚合功能。所谓聚合,是指将具有相关性的内容归集为一组,以便统一展示或建立关联。在Django的语境下,聚合功能主要应用于以下几种典型场景:

在数据库表中检索指定列的最大值或最小值。

依据特定列对数据库中的记录进行数量统计。

计算一组相似对象在特定字段上的平均值。

计算指定列中所有数值的总和。

通常情况下,聚合操作针对的数据类型包括整数、浮点数、日期以及日期时间等类型。

从本质上讲,聚合是对一组数据行执行特定运算的操作。在SQL数据库中,这类运算由SUM、AVG等运算符表示。为了支持这些操作,Django在查询集(QuerySet)中引入了两个核心新方法。

这两个方法分别是聚合(Aggregate)和注释(Annotate)。可以这样理解:在SQL层面,Aggregate对应的是不带GROUP BY子句的聚合函数(如SUM、AVG、MIN、MAX);而Annotate则对应带有GROUP BY子句(默认基于rowet_table.id,除非显式指定覆盖)的聚合操作。

Django项目初始化与配置

接下来,我们将通过构建一个完整的Django项目来演示具体操作。


#创建工程
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 
]

接着,执行数据库迁移命令以初始化数据库结构。


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

将定义好的模型注册到Django 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管理面板,向数据库中录入若干测试数据。数据准备就绪后,即可开始执行聚合查询命令。

为了执行聚合命令,我们需要进入Django Shell交互环境。

在终端中运行以下命令启动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')}

注释(Annotate)与分组统计应用

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 相关产品和应用

全部下载

专题列表