Django 的django.db.models 模块提供以下聚合函数。
警告
SQLite 不能直接处理日期/时间字段的聚合。这是因为SQLite 中没有原生的日期/时间字段,Django 目前使用文本字段模拟它的功能。在SQLite 中对日期/时间字段使用聚合将引发NotImplementedError。
注
:
在QuerySet 为空时,聚合函数函数将返回None。 例如,如果QuerySet 中没有记录,Sum 聚合函数将返回None 而不是0。Count 是一个例外,如果QuerySet 为空,它将返回0
聚合函数的参数:
所有聚合函数具有以下共同的参数:
function 描述将生成的函数的类属性,函数将会替template中函数占位符
template 类属性,作为格式字符串,描述此函数生成的sql语句,默认为'%(function)s(%(expressions)s)'
arg_joiner 类属性,表示用于连接表达式列表的字符,默认为","
expressions 对模型哪个字段进行聚合,字符串格式的字段名,可以是多个字段
在填充到template中之前会使用arg_joiner进行join拼接
output_field 当聚合的多个字段拥有相同的值类型,不需要指定output_field ,
若类型不相同,就需要通过output_field 指定返回的字段类型
**extra 这些关键字参数可以给聚合函数生成的SQL 提供额外的信息。
聚合函数
avg函数
class Avg(expression, output_field=None, **extra):
返回给定expression 的平均值,其中expression 字段的类型必须为数值。expression指的是模型字段
默认的别名:<field>__avg
返回类型:float
示例:
from django.db.models import Func, F
queryset = Students.objects.all()
queryset.annotate(field_lower=Func(F('field'), function='Avg'))
也可以
queryset.annotate(field_lower=Avg(F('field'))
# field_lower 是手动指定的返回的字段名,可以通过实例.field_lower 获取平均值
Count函数
class Count(expression, distinct=False, **extra):
返回与expression 相关的对象的个数。
默认的别名:<field>__count
返回类型:int
有一个可选的参数:
distinct 如果distinct=True,Count 将只计算唯一的实例。
它等同于COUNT(DISTINCT <field>) SQL 语句。默认值为False。
Max函数
class Max(expression, output_field=None, **extra):
返回expression 的最大值。
默认的别名:<field>__max
返回类型:与输入字段的类型相同,如果设置了output_field属性则为 output_field 类型
Min函数
class Min(expression, output_field=None, **extra):
返回expression 的最小值。
默认的别名:<field>__min
返回的类型:与输入字段的类型相同,如果提供则为 output_field 类型
StdDev函数
class StdDev(expression, sample=False, **extra):
返回expression 的标准差。
默认的别名:<field>__stddev
返回类型:float
有一个可选的参数:sample
默认情况下,StdDev 返回群体的标准差。但是,如果sample=True,返回的值将是样本的标准差。
SQLite 没有直接提供StdDev,如果想要使用请百度解决办法
Sum函数
class Sum(expression, output_field=None, **extra):
计算expression 的所有值的和。
默认的别名:<field>__sum
返回类型:与输入的字段相同,如果提供则为output_field 的类型
Variance 函数
class Variance(expression, sample=False, **extra):
返回expression 的方差。
默认的别名:<field>__variance
返回的类型:float
有一个可选的参数:sample
默认情况下,Variance 返回群体的方差。但是,如果sample=True,返回的值将是样本的方差。
SQLite 没有直接提供Variance。使用请百度解决方案
网友评论