PostgreSQL-specifika aggregeringsfunktionerLink to this heading

Dessa funktioner är tillgängliga från modulen django.contrib.postgres.aggregates. De beskrivs mer detaljerat i PostgreSQL-dokumenten.

Aggregeringsfunktioner för allmänt brukLink to this heading

ArrayAggLink to this heading

class ArrayAgg(expression, distinct=False, filter=None, default=None, order_by=(), **extra)Link to this definition

Returnerar en lista med värden, inklusive nollvärden, sammanlänkade till en array, eller default om det inte finns några värden.

distinctLink to this definition

Ett valfritt booleskt argument som avgör om matrisvärdena ska vara distinkta. Standardvärdet är False.

order_byLink to this definition

En valfri sträng med ett fältnamn (med ett valfritt prefix "-" som anger fallande ordning) eller ett uttryck (eller en tupel eller en lista med strängar och/eller uttryck) som anger ordningen på elementen i resultatlistan.

Exempel:

Code
from django.db.models import F

ArrayAgg("a_field", order_by="-some_field")
ArrayAgg("a_field", order_by=F("some_field").desc())

Bit ochLink to this heading

class BitAnd(expression, filter=None, default=None, **extra)Link to this definition

Returnerar ett int av bitvis AND av alla icke-null värden, eller default om alla värden är null.

BitOrLink to this heading

class BitOr(expression, filter=None, default=None, **extra)Link to this definition

Returnerar ett int av det bitvisa OR av alla icke-null indatavärden, eller default om alla värden är null.

BitXorLink to this heading

class BitXor(expression, filter=None, default=None, **extra)Link to this definition

Returnerar en int av den bitvisa XOR av alla icke-null-ingångsvärden, eller default om alla värden är null. Det kräver PostgreSQL 14+.

BoolAndLink to this heading

class BoolAnd(expression, filter=None, default=None, **extra)Link to this definition

Returnerar True, om alla indatavärden är sanna, default om alla värden är null eller om det inte finns några värden, annars False.

Exempel på användning:

Code
class Comment(models.Model):
    body = models.TextField()
    published = models.BooleanField()
    rank = models.IntegerField()
Python console
>>> 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}

BoolOrLink to this heading

class BoolOr(expression, filter=None, default=None, **extra)Link to this definition

Returnerar True om minst ett inmatningsvärde är sant, default om alla värden är null eller om det inte finns några värden, annars False.

Exempel på användning:

Code
class Comment(models.Model):
    body = models.TextField()
    published = models.BooleanField()
    rank = models.IntegerField()
Python console
>>> 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}

JSONBAggLink to this heading

class JSONBAgg(expressions, distinct=False, filter=None, default=None, order_by=(), **extra)Link to this definition

Returnerar indatavärdena som en JSON-array, eller default om det inte finns några värden. Du kan fråga efter resultatet med hjälp av nyckel- och indexuppslagningar.

distinctLink to this definition

Ett valfritt booleskt argument som avgör om matrisvärdena ska vara distinkta. Standardvärdet är False.

order_byLink to this definition

En valfri sträng med ett fältnamn (med ett valfritt prefix "-" som anger fallande ordning) eller ett uttryck (eller en tupel eller en lista med strängar och/eller uttryck) som anger ordningen på elementen i resultatlistan.

Exemplen är desamma som för ArrayAgg.order_by.

Exempel på användning:

Code
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)
Python console
>>> from django.contrib.postgres.aggregates import JSONBAgg
>>> Room.objects.annotate(
...     requirements=JSONBAgg(
...         "hotelreservation__requirements",
...         order_by="-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}
]}]>

StringAggLink to this heading

class StringAgg(expression, delimiter, distinct=False, filter=None, default=None, order_by=())Link to this definition

Returnerar indatavärdena sammankopplade till en sträng, åtskilda av strängen delimiter eller default om det inte finns några värden.

delimiterLink to this definition

Obligatoriskt argument. Måste vara en sträng.

distinctLink to this definition

Ett valfritt booleanskt argument som avgör om sammanlänkade värden ska vara distinkta. Standardvärdet är False.

order_byLink to this definition

En valfri sträng med ett fältnamn (med ett valfritt prefix "-" som anger fallande ordning) eller ett uttryck (eller en tupel eller en lista med strängar och/eller uttryck) som anger ordningen på elementen i resultatsträngen.

Exemplen är desamma som för ArrayAgg.order_by.

Exempel på användning:

Code
class Publication(models.Model):
    title = models.CharField(max_length=30)


class Article(models.Model):
    headline = models.CharField(max_length=100)
    publications = models.ManyToManyField(Publication)
Python console
>>> 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=", ",
...         order_by="publications__title",
...     )
... ).values("headline", "publication_names")
<QuerySet [{
    'headline': 'NASA uses Python', 'publication_names': 'Science News, The Python Journal'
}]>

Aggregerade funktioner för statistikLink to this heading

y och xLink to this heading

Argumenten y och x för alla dessa funktioner kan vara namnet på ett fält eller ett uttryck som returnerar numeriska data. Båda är obligatoriska.

CorrLink to this heading

class Corr(y, x, filter=None, default=None)Link to this definition

Returnerar korrelationskoefficienten som en flata, eller standard om det inte finns några matchande rader.

CovarPopLink to this heading

class CovarPop(y, x, sample=False, filter=None, default=None)Link to this definition

Returnerar populationens kovarians som en flata, eller standard om det inte finns några matchande rader.

sampleLink to this definition

Valfritt. Som standard returnerar CovarPop den allmänna populationens kovarians. Men om sample=True, kommer returvärdet att vara urvalspopulationens kovarians.

RegrAvgXLink to this heading

class RegrAvgX(y, x, filter=None, default=None)Link to this definition

Returnerar medelvärdet av den oberoende variabeln (sum(x)/N) som en flata, eller standard om det inte finns några matchande rader.

RegrAvgYLink to this heading

class RegrAvgY(y, x, filter=None, default=None)Link to this definition

Returnerar medelvärdet av den beroende variabeln (sum(y)/N) som en flata, eller standard om det inte finns några matchande rader.

RegrCountLink to this heading

class RegrCount(y, x, filter=None)Link to this definition

Returnerar ett int av antalet indatarader där båda uttrycken inte är null.

RegrInterceptLink to this heading

class RegrIntercept(y, x, filter=None, default=None)Link to this definition

Returnerar y-interceptet för den linjära ekvationen med minsta kvadratanpassning som bestäms av paren (x, y) som en float, eller default om det inte finns några matchande rader.

RegrR2Link to this heading

class RegrR2(y, x, filter=None, default=None)Link to this definition

Returnerar kvadraten på korrelationskoefficienten som en float, eller default om det inte finns några matchande rader.

RegrSlopeLink to this heading

class RegrSlope(y, x, filter=None, default=None)Link to this definition

Returnerar lutningen för den linjära ekvationen med minsta kvadratanpassning som bestäms av paren (x, y) som en flata, eller default om det inte finns några matchande rader.

RegrSXXLink to this heading

class RegrSXX(y, x, filter=None, default=None)Link to this definition

Returnerar sum(x^2) - sum(x)^2/N (”kvadratsumman” för den oberoende variabeln) som en float, eller default om det inte finns några matchande rader.

RegrSXYLink to this heading

class RegrSXY(y, x, filter=None, default=None)Link to this definition

Returnerar sum(x*y) - sum(x) * sum(y)/N (”summan av produkter” av oberoende gånger beroende variabel) som en float, eller default om det inte finns några matchande rader.

RegrSYYLink to this heading

class RegrSYY(y, x, filter=None, default=None)Link to this definition

Returnerar sum(y^2) - sum(y)^2/N (”kvadratsumman” för den beroende variabeln) som en float, eller default om det inte finns några matchande rader.

Exempel på användningLink to this heading

Vi kommer att använda denna exempeltabell:

Text
| FIELD1 | FIELD2 | FIELD3 |
|--------|--------|--------|
|    foo |      1 |     13 |
|    bar |      2 | (null) |
|   test |      3 |     13 |

Här följer några exempel på några av de allmänna aggregeringsfunktionerna:

Python console
>>> 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']}

Nästa exempel visar användningen av statistiska aggregatfunktioner. Den underliggande matematiken kommer inte att beskrivas (du kan läsa om detta, till exempel på wikipedia):

Python console
>>> 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}