Перейти к содержанию

агрегатные функции

В настоящее время поддерживаются шесть функций.

  • count(distinct: bool = True) -> int

  • Существо () -> логическое значение

  • Сумма (столбец)-> произвольное

  • Среднее значение (столбец)-> произвольное

  • Минуты (столбец)-> произвольное

  • Макс.(столбец)-> произвольное

  • Агент набора запросов

    • QuerysetProxy.count(distinct=True) Методологии
    • Метод QuerysetProxy.exists ()
    • Метод QuerysetProxy.sum (columns)
    • Метод QuerysetProxy.avg (columns)
    • Метод QuerysetProxy.min (column)
    • Метод QuerysetProxy.max

Количество

count(distinct: bool = True) -> int

Возвращает количество строк, соответствующих заданному условию (т. е. применение фильтра и исключение). Если distinct имеет значение True (значение по умолчанию), то возвращается основное количество выбранных строк. Если False, то число будет возвращено (включая дополнительные строки, соединенные с таблицей "один к нескольким" или "несколько к нескольким левым"). False является остаточным (дефектным) поведением зависящего от него рабочего процесса.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Модель (Ormar):
    Органом-де-Органом-Органом-де-Органом-Органом (
        Database=databases.Database(DATABASE),
        metadata= sqalchemy (),
        tablename="book"
    )

    id: int = ormar.Integer(primary_key =True)
    title: str = ormar.String(max_length =200)
    author: str = ormar.String(max_length =100)
    (((
        max_length =100,
        default="Fiction",
        choices=["Fiction", "Adventure", "Historic", "Fantasy"],
    )


# Returns count of rows in db for Books модель
no_of_books = await Book.objects.count ()

Существует

Существо () -> логическое значение

Возвращает логическое значение для подтверждения наличия строки, соответствующей заданному условию (применяется с фильтрами и исключениями)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
Модель (Ormar):
    Органом-де-Органом-Органом-де-Органом-Органом (
        Database=databases.Database(DATABASE),
        metadata= sqalchemy (),
        tablename="book"
    )

    id: int = ormar.Integer(primary_key =True)
    title: str = ormar.String(max_length =200)
    author: str = ormar.String(max_length =100)
    (((
        max_length =100,
        default="Fiction",
        choices=["Fiction", "Adventure", "Historic", "Fantasy"],
    )


# returns a boolean value if given row exists
has_sample = await Book.objects.filter (title ='Sample').exists()

и

Сумма (столбец)-> произвольное

Возвращает суммарное значение столбцов строк, соответствующих заданному условию (применяется фильтр и исключается, если задано ранее).

Можно передать одно или несколько имен столбцов, включая связанные столбцы.

До сих пор каждый переданный столбец агрегирован отдельно (так что sum(col1+col2) невозможен, вы можете использовать sum(col1, col2), а затем добавить в Python сумму 2 возвращенных значений).

Нельзя суммировать значения нечисловых столбцов.

Если один столбец агрегирован, то сразу возвращает одно значение в качестве результата Если агрегировано несколько столбцов, возвращает словарь, содержащий пару column: результатов

Данная модель выглядит следующим образом

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import Optional

import databases
import ormar
import sqlalchemy
from tests.settings import DATABASE_URL

database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()


base_ormar_config = ormar.OrmarConfig(
    metadata=metadata,
    database=database,
)


class Author(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="authors", order_by=["-name"])

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Book(ormar.Model):

    ormar_config = base_ormar_config.copy(
        tablename="books", order_by=["year", "-ranking"]
    )

    id: int = ormar.Integer(primary_key=True)
    author: Optional[Author] = ormar.ForeignKey(Author)
    title: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    ranking: int = ormar.Integer(nullable=True)

Примеры использования могут выглядеть следующим образом

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
author = await Author(name="Author 1").save(
await Book(title="Book 1", year=1920, ranking=3, author=author).save()
await Book(title="Book 2", year=1930, ranking=1, author=author).save()
await Book(title="Book 3", year=1923, ranking=5, author=author).save()

assert await Book. objects.sum ("год") = 5773
result = await Book.objects.sum (["year", "ranking"])
Assert result === dict(год =5773, ranking=9)

try:
    #can not sum string column
    await Book. objects.sum ("title")
QueryDefinitionError:
    Pass

assert await Author.objects.select ("books").sum("books__year") == 5773
result = Author.objects.select ("books").sum(
    ["books_year", "books_ranking"]
)
assert result === dict(books_year =5773, books_ranking =9)

Аварийный (
    Author.objects.select ("books")
    filter(books_year_lt =1925)
    .sum("books_year")
    == 3843
)

В среднем

Среднее значение (столбец)-> произвольное

Возвращает среднее значение столбца строки, соответствующей заданному условию (применяется фильтр и исключается, если задано ранее).

Можно передать одно или несколько имен столбцов, включая связанные столбцы.

До сих пор каждый переданный столбец агрегирован отдельно (так что sum(col1+col2) невозможен, вы можете использовать sum(col1, col2), а затем добавить в Python сумму 2 возвращенных значений).

Невозможно усреднять значения для нечисловых столбцов.

Если один столбец агрегирован, то сразу возвращает одно значение в качестве результата Если агрегировано несколько столбцов, возвращает словарь, содержащий пару column: результатов

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import Optional

import databases
import ormar
import sqlalchemy
from tests.settings import DATABASE_URL

database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()


base_ormar_config = ormar.OrmarConfig(
    metadata=metadata,
    database=database,
)


class Author(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="authors", order_by=["-name"])

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Book(ormar.Model):

    ormar_config = base_ormar_config.copy(
        tablename="books", order_by=["year", "-ranking"]
    )

    id: int = ormar.Integer(primary_key=True)
    author: Optional[Author] = ormar.ForeignKey(Author)
    title: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    ranking: int = ormar.Integer(nullable=True)

Примеры использования могут выглядеть следующим образом

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
author = await Author(name="Author 1").save(
await Book(title="Book 1", year=1920, ranking=3, author=author).save()
await Book(title="Book 2", year=1930, ranking=1, author=author).save()
await Book(title="Book 3", year=1923, ranking=5, author=author).save()

assert round(float(await Book. objects.avg ("year")), 2) == 1924,33
result = await Book.objects.avg (["year", "ranking"])
assert round(float(result.get ("год")), 2) == 1924,33
assert result.get ("ranking") == 3,0

try:
    #can not avg string column
    await Book.objects.avg("title")
QueryDefinitionError:
    Pass

result = Author.objects.select ("books").avg("books_year")
0 0) = 1924,33
result = Author.objects.select ("books").avg(
    ["books_year", "books_ranking"]
)
assert round(float(result.get ("books_year")), 2) == 1924,33
assert result.get ("books__ranking") == 3.0

Аварийный (
    Author.objects.select ("books")
    filter(books_year_lt =1925)
    .avg("books_year")
    == 1921.5
)

Минуты

Минуты (столбец)-> произвольное

Возвращает минимальное значение столбца строки, соответствующей заданному условию (применяется с фильтром и исключается, если ранее задано).

Можно передать одно или несколько имен столбцов, включая связанные столбцы.

До сих пор каждый переданный столбец агрегирован отдельно (так что sum(col1+col2) невозможен, вы можете использовать sum(col1, col2), а затем добавить в Python сумму 2 возвращенных значений).

Если один столбец агрегирован, то сразу возвращает одно значение в качестве результата Если агрегировано несколько столбцов, возвращает словарь, содержащий пару column: результатов

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import Optional

import databases
import ormar
import sqlalchemy
from tests.settings import DATABASE_URL

database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()


base_ormar_config = ormar.OrmarConfig(
    metadata=metadata,
    database=database,
)


class Author(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="authors", order_by=["-name"])

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Book(ormar.Model):

    ormar_config = base_ormar_config.copy(
        tablename="books", order_by=["year", "-ranking"]
    )

    id: int = ormar.Integer(primary_key=True)
    author: Optional[Author] = ormar.ForeignKey(Author)
    title: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    ranking: int = ormar.Integer(nullable=True)

Примеры использования могут выглядеть следующим образом

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
author = await Author(name="Author 1").save(
await Book(title="Book 1", year=1920, ranking=3, author=author).save()
await Book(title="Book 2", year=1930, ranking=1, author=author).save()
await Book(title="Book 3", year=1923, ranking=5, author=author).save()

assert await Book. objects.min ("year") == 1920
result = await Book.objects.min (["year", "ranking"])
Assert result === dict(год =1920, ranking=1)

assert await Book.objects.min ("title") = "Book 1"

assert await Author.objects.select ("books").min("books__year") == 1920
result = Author.objects.select ("books").min(
    ["books_year", "books_ranking"]
)
assert result === dict(books_year =1920, books_ranking =1)

Аварийный (
    Author.objects.select ("books")
    filter(books_year_gt =1925)
    .min("books_year")
    == 1930
)

Максимум

Макс.(столбец)-> произвольное

Возвращает максимальное значение столбца строки, соответствующей заданному условию (применяется с фильтром и исключается, если ранее задано).

Возвращает минимальное значение столбца строки, соответствующей заданному условию (применяется с фильтром и исключается, если ранее задано).

Можно передать одно или несколько имен столбцов, включая связанные столбцы.

До сих пор каждый переданный столбец агрегирован отдельно (так что sum(col1+col2) невозможен, вы можете использовать sum(col1, col2), а затем добавить в Python сумму 2 возвращенных значений).

Если один столбец агрегирован, то сразу возвращает одно значение в качестве результата Если агрегировано несколько столбцов, возвращает словарь, содержащий пару column: результатов

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from typing import Optional

import databases
import ormar
import sqlalchemy
from tests.settings import DATABASE_URL

database = databases.Database(DATABASE_URL)
metadata = sqlalchemy.MetaData()


base_ormar_config = ormar.OrmarConfig(
    metadata=metadata,
    database=database,
)


class Author(ormar.Model):
    ormar_config = base_ormar_config.copy(tablename="authors", order_by=["-name"])

    id: int = ormar.Integer(primary_key=True)
    name: str = ormar.String(max_length=100)


class Book(ormar.Model):

    ormar_config = base_ormar_config.copy(
        tablename="books", order_by=["year", "-ranking"]
    )

    id: int = ormar.Integer(primary_key=True)
    author: Optional[Author] = ormar.ForeignKey(Author)
    title: str = ormar.String(max_length=100)
    year: int = ormar.Integer(nullable=True)
    ranking: int = ormar.Integer(nullable=True)

Примеры использования могут выглядеть следующим образом

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
author = await Author(name="Author 1").save(
await Book(title="Book 1", year=1920, ranking=3, author=author).save()
await Book(title="Book 2", year=1930, ranking=1, author=author).save()
await Book(title="Book 3", year=1923, ranking=5, author=author).save()

assert await Book. objects.max ("year") == 1930
result = await Book.objects.max (["year", "ranking"])
Assert result === dict(год =1930, ranking=5)

assert await Book. objects.max ("title") == "Book 3"

assert await Author.objects.select ("books").max("books_year") == 1930
Рекорт = Author.objects.select ("books").max(
    ["books_year", "books_ranking"]
)
assert result === dict(books_year =1930, books_ranking =5)

Аварийный (
    Author.objects.select ("books")
    filter(books_year_lt =1925)
    .max("books_year")
    == 1923
)

Метод QuerysetProxy

При прямом доступе к соответствующему полю ManyToMany и ReverseForeignKey, возвращайтесь к списку связанных моделей.

Но в то же время он предоставляет подмножество API QuerySet, поэтому вы можете фильтровать, создавать и выбирать связанные модели непосредственно из родительской модели.

Число

То же самое, что и функция count выше, но позволяет выбрать столбец из связанного объекта на другом конце отношения.

Tip

Существует

То же самое, что и функция существования, описанная выше, но позволяет выбрать столбец из связанного объекта на другом конце отношения.

и

То же самое, что и функция sum выше, но позволяет суммировать столбцы связанных объектов на другом конце отношения.

В среднем

То же самое, что и функция avg выше, но позволяет усреднять столбцы связанных объектов на другом конце отношения.

Минуты

То же самое, что и функция min выше, но позволяет выбрать наименьшее количество столбцов из связанных объектов на другом конце отношения.

Максимум

То же самое, что и функция max выше, но позволяет выбрать самый большой столбец из связанного объекта на другом конце отношения.

Tip