这些功能可从 django.contrib.postgres.aggregates
模块。它们在 PostgreSQL docs .
备注
所有函数都没有默认别名,因此必须显式提供一个。例如:
>>> SomeModel.objects.aggregate(arr=ArrayAgg("somefield"))
{'arr': [0, 1, 2]}
ArrayAgg
¶返回串联到数组中的值的列表,包括空值,或 default
如果没有值。
一个可选的布尔参数,用于确定数组值是否不同。默认为 False
.
字段名的可选字符串(带有可选的 "-"
表示降序的前缀)或指定结果列表中元素顺序的表达式(或元组或字符串和/或表达式列表)。
实例:
"some_field"
"-some_field"
from django.db.models import F
F("some_field").desc()
BitAnd
¶返回一个 int
按位计算的 AND
所有非空输入值的值,或 default
如果所有值都为空。
BitOr
¶返回一个 int
按位计算的 OR
所有非空输入值的值,或 default
如果所有值都为空。
BitXor
¶返回一个 int
按位计算的 XOR
所有非空输入值的值,或 default
如果所有值都为空。它需要PostgreSQL 14+。
BoolAnd
¶退货 True
,如果所有输入值都为真, default
如果所有值都为空或如果没有值,则为 False
。
使用实例:
class Comment(models.Model):
body = models.TextField()
published = models.BooleanField()
rank = models.IntegerField()
>>> from django.db.models import Q
>>> from django.contrib.postgres.aggregates import BoolAnd
>>> Comment.objects.aggregate(booland=BoolAnd("published"))
{'booland': False}
>>> Comment.objects.aggregate(booland=BoolAnd(Q(rank__lt=100)))
{'booland': True}
BoolOr
¶退货 True
如果至少一个输入值为真, default
如果所有值都为空或如果没有值,则为 False
。
使用实例:
class Comment(models.Model):
body = models.TextField()
published = models.BooleanField()
rank = models.IntegerField()
>>> from django.db.models import Q
>>> from django.contrib.postgres.aggregates import BoolOr
>>> Comment.objects.aggregate(boolor=BoolOr("published"))
{'boolor': True}
>>> Comment.objects.aggregate(boolor=BoolOr(Q(rank__gt=2)))
{'boolor': False}
JSONBAgg
¶将输入值作为 JSON
数组,或 default
如果没有值。您可以使用以下命令查询结果 key and index lookups
。
一个可选的布尔参数,用于确定数组值是否不同。默认为 False
.
字段名的可选字符串(带有可选的 "-"
表示降序的前缀)或指定结果列表中元素顺序的表达式(或元组或字符串和/或表达式列表)。
示例与 ArrayAgg.ordering
.
使用实例:
class Room(models.Model):
number = models.IntegerField(unique=True)
class HotelReservation(models.Model):
room = models.ForeignKey("Room", on_delete=models.CASCADE)
start = models.DateTimeField()
end = models.DateTimeField()
requirements = models.JSONField(blank=True, null=True)
>>> from django.contrib.postgres.aggregates import JSONBAgg
>>> Room.objects.annotate(
... requirements=JSONBAgg(
... "hotelreservation__requirements",
... ordering="-hotelreservation__start",
... )
... ).filter(requirements__0__sea_view=True).values("number", "requirements")
<QuerySet [{'number': 102, 'requirements': [
{'parking': False, 'sea_view': True, 'double_bed': False},
{'parking': True, 'double_bed': True}
]}]>
StringAgg
¶返回串联成字符串的输入值,该字符串由 delimiter
字符串,或 default
如果没有值。
必需参数。必须是字符串。
一个可选的布尔参数,用于确定连接的值是否不同。默认为 False
.
字段名的可选字符串(带有可选的 "-"
表示降序的前缀)或指定结果字符串中元素顺序的表达式(或元组或字符串和/或表达式列表)。
示例与 ArrayAgg.ordering
.
使用实例:
class Publication(models.Model):
title = models.CharField(max_length=30)
class Article(models.Model):
headline = models.CharField(max_length=100)
publications = models.ManyToManyField(Publication)
>>> article = Article.objects.create(headline="NASA uses Python")
>>> article.publications.create(title="The Python Journal")
<Publication: Publication object (1)>
>>> article.publications.create(title="Science News")
<Publication: Publication object (2)>
>>> from django.contrib.postgres.aggregates import StringAgg
>>> Article.objects.annotate(
... publication_names=StringAgg(
... "publications__title",
... delimiter=", ",
... ordering="publications__title",
... )
... ).values("headline", "publication_names")
<QuerySet [{
'headline': 'NASA uses Python', 'publication_names': 'Science News, The Python Journal'
}]>
y
and x
¶论点 y
和 x
对于所有这些函数,可以是返回数值数据的字段或表达式的名称。两者都是必需的。
Corr
¶将相关系数作为 float
,或 default
如果没有任何匹配的行。
CovarPop
¶RegrAvgX
¶返回自变量的平均值 (sum(x)/N
)作为 float
,或 default
如果没有任何匹配的行。
RegrAvgY
¶返回因变量的平均值 (sum(y)/N
)作为 float
,或 default
如果没有任何匹配的行。
RegrCount
¶返回一个 int
两个表达式都不为空的输入行数。
备注
这个 default
参数不受支持。
RegrIntercept
¶方法确定的最小二乘拟合线性方程的y截距。 (x, y)
配对作为 float
,或 default
如果没有任何匹配的行。
RegrR2
¶将相关系数的平方作为 float
,或 default
如果没有任何匹配的行。
RegrSlope
¶属性确定的最小二乘拟合线性方程的斜率。 (x, y)
配对作为 float
,或 default
如果没有任何匹配的行。
RegrSXX
¶退货 sum(x^2) - sum(x)^2/N
(自变量的“平方和”)作为 float
,或 default
如果没有任何匹配的行。
RegrSXY
¶退货 sum(x*y) - sum(x) * sum(y)/N
(独立时间因变量的乘积之和)作为 float
,或 default
如果没有任何匹配的行。
RegrSYY
¶退货 sum(y^2) - sum(y)^2/N
(因变量的“平方和”)作为 float
,或 default
如果没有任何匹配的行。
我们将使用此示例表:
| FIELD1 | FIELD2 | FIELD3 |
|--------|--------|--------|
| foo | 1 | 13 |
| bar | 2 | (null) |
| test | 3 | 13 |
以下是一些通用聚合函数的示例:
>>> TestModel.objects.aggregate(result=StringAgg("field1", delimiter=";"))
{'result': 'foo;bar;test'}
>>> TestModel.objects.aggregate(result=ArrayAgg("field2"))
{'result': [1, 2, 3]}
>>> TestModel.objects.aggregate(result=ArrayAgg("field1"))
{'result': ['foo', 'bar', 'test']}
下一个示例显示了统计聚合函数的用法。基本的数学将不会被描述(您可以阅读有关这方面的内容,例如, wikipedia ):
>>> TestModel.objects.aggregate(count=RegrCount(y="field3", x="field2"))
{'count': 2}
>>> TestModel.objects.aggregate(
... avgx=RegrAvgX(y="field3", x="field2"), avgy=RegrAvgY(y="field3", x="field2")
... )
{'avgx': 2, 'avgy': 13}
7月 22, 2024