Django聚合查询支持更多函数吗

wen python案例 1

本文目录导读:

Django聚合查询支持更多函数吗

  1. 标准聚合函数(最常用)
  2. 高级聚合函数(需要特定数据库支持)
  3. 实用示例
  4. 不同数据库支持差异

是的,Django 聚合查询支持很多函数,远不止基础的 CountSumAvgMaxMin

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 的聚合支持最为全面。

抱歉,评论功能暂时关闭!