本文目录导读:

是的,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 的聚合支持最为全面。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播