本文目录导读:

是的,Django 聚合查询支持很多函数,远不止基础的 Count、Sum、Avg、Max、Min。
Django 的聚合函数主要来自 django.db.models 模块,分为两类:
标准聚合函数(最常用)
from django.db.models import Count, Sum, Avg, Max, Min, StdDev, Variance
- Count:计数
- Sum:求和
- Avg:平均值
- Max:最大值
- Min:最小值
- StdDev:标准差(PostgreSQL 支持)
- Variance:方差(PostgreSQL 支持)
高级聚合函数(需要特定数据库支持)
from django.db.models import Count, Sum
from django.db.models.functions import (
ExtractYear, ExtractMonth, ExtractDay, # 提取日期部分
TruncDate, TruncMonth, TruncYear, # 截断日期
Coalesce, # 处理 NULL
Concat, # 字符串拼接
Substr, # 字符串截取
Length, # 字符串长度
Lower, Upper, # 大小写转换
Now, # 当前时间
Cast, # 类型转换
)
实用示例
日期相关聚合
from django.db.models import Count
from django.db.models.functions import ExtractYear, TruncMonth
# 按年份统计文章数量
Article.objects.annotate(year=ExtractYear('pub_date')).values('year').annotate(count=Count('id'))
# 按月统计销售额
Order.objects.annotate(month=TruncMonth('created_at')).values('month').annotate(total=Sum('amount'))
条件聚合(Django 2.0+)
from django.db.models import Count, Q, Sum, Case, When, IntegerField
# 统计满足条件的数量
User.objects.aggregate(
active_count=Count('id', filter=Q(is_active=True)),
inactive_count=Count('id', filter=Q(is_active=False))
)
# 更复杂的条件求和
Order.objects.aggregate(
paid_total=Sum('amount', filter=Q(status='paid')),
pending_total=Sum('amount', filter=Q(status='pending'))
)
窗口函数(PostgreSQL)
from django.db.models import Window, F, Sum
from django.db.models.functions import RowNumber, Rank
# 计算累计和
Sales.objects.annotate(
running_total=Window(
expression=Sum('amount'),
order_by=F('date').asc()
)
)
不同数据库支持差异
| 函数 | PostgreSQL | MySQL | SQLite |
|---|---|---|---|
| StdDev/Variance | |||
| 窗口函数 | |||
| Filtered aggregates | ✅ (Django 3.2+) | ||
| Extract 日期函数 |
建议:如果你需要更复杂的聚合逻辑,组合使用 annotate()、values()、filter() 和条件表达式可以实现绝大多数需求,对于 PostgreSQL 用户,Django 的聚合支持最为全面。