агрегатные функции
В настоящее время поддерживаются шесть функций.
-
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 выше, но позволяет выбрать столбец из связанного объекта на другом конце отношения.
Существует
То же самое, что и функция существования, описанная выше, но позволяет выбрать столбец из связанного объекта на другом конце отношения.
и
То же самое, что и функция sum выше, но позволяет суммировать столбцы связанных объектов на другом конце отношения.
В среднем
То же самое, что и функция avg выше, но позволяет усреднять столбцы связанных объектов на другом конце отношения.
Минуты
То же самое, что и функция min выше, но позволяет выбрать наименьшее количество столбцов из связанных объектов на другом конце отношения.
Максимум
То же самое, что и функция max выше, но позволяет выбрать самый большой столбец из связанного объекта на другом конце отношения.