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

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

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

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

!!!Обратите внимание, что по умолчанию открытый файл QuerySet отфильтрован для возврата только модели, связанные с родительской моделью.

1
Если вы будете оспаривать `post.categories.all()`, вы будете получать все категории, связанные с этим сообщением, но не все в таблице.

!!!note Обратите внимание, что при доступе к методу QuerysetProxy к API QuerySet не требуется использовать свойства объекта, как это делается в обычном запросе.

1
2
3
So note that it's `post.categories.all()` and**not** `post.categories.objects.all()`.

To learn more about available QuerySet methods visit [queries][queries]

!!!Предупреждение, что запрос связанной модели из ManyToMany приводит к удалению списка связанных моделей, загруженных в родительскую модель:

1
2
3
4
5
6
7
8
9
Example:`post.categories.first()` will set post.categories to list of 1 related model -> the one returned by first()

Пример 2: if post has 4 categories so `len(post.categories) == 4` calling `post.categories.limit(2).all()`
Читать далее: Will load Only 2 Children and Now `assert len(post.categories) == 2`

This happens for all QuerysetProxy methods returning data:`get`,`all` and `first` and in `get_or_create` if model already exists

Note that value returned by `create` or created in `get_or_create` and `update_or_create`
Если модель не будет выглядеть, она будет added to relation list (not clearing it)

Чтение данных из базы данных

Получить

get(**kwargs): -> модель

Чтобы получить только одну из связанных моделей, отфильтрованных по имени, можно использовать метод get(**kwargs).

1
2
3
4
5
6
7
8
9
# grab one category
assert news == await post.categories.get (name="News")

# note method that returns the category so you can grab this value
# But It Also modifies Список связанных моделей в местах
So regardless of what was previously loaded on parent модель
# now it has only one value (just load with get)-call
assert len(post.categories) == 1
assert post.categories[0] = news

Tip

Получить или создать

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

При попытке получить строку, удовлетворяющую критериям, при возникновении исключения NoMatch создается новая строка с использованием данных kwargs и_defaults.

!!!tip Читать далее в документе get_or_create

Все.

all(**kwargs) -> List[Optional["Model"]]

Для получения списка связанных моделей используйте метод all().

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

1
2
3
4
5
6
7
# with all Queryset methods - filtering, selecting columns, counting etc.
await news.posts.filter(title_contains ="M2M").all()
await Category.objects.filter(posts_author =guido).get()

# columns models of many to many relation Can Be prefetched
news_posts = await news.posts.select ("author").all(
assert news_posts [0].author = guido

Tip

Итерация

iterate(**kwargs) -> AsyncGenerator["Model"]

Для итерации связанных моделей используйте метод iterate().

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

1
2
3
# iterate on categories of this post with an async generator
async for category in post.categories.iterate ()
    print(категория).

Tip

Вставка/обновление данных в базе данных

Создавая

Создание (**kwargs): -> модель

Создайте зависимую модель непосредственно из родительской модели.

Связанные таблицы и идентификаторы связей в базе данных заполняются автоматически.

1
2
3
4
#Создание объектов из instance:
await post.categories.create(name="Tips")
assert len(await post.categories.all()) == 2
# newly created instance alady have relation persisted in the database

Tip

Для отношений "Много-много", если в явно поставляемой модели объявляются дополнительные поля, имеется дополнительная функция передачи параметров, которая используется для создания сквозной модели.

Приводим такой образец:

 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
import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Category(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="categories")

    id = ormar.Integer(primary_key=True)
    name = ormar.String(max_length=40)


class PostCategory(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="posts_x_categories")

    id: int = ormar.Integer(primary_key=True)
    sort_order: int = ormar.Integer(nullable=True)
    param_name: str = ormar.String(default="Name", max_length=200)


class Post(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    categories = ormar.ManyToMany(Category, through=PostCategory)

Поле модели можно заполнить в вызове create() следующими способами:

1
2
3
4
5
6
7
post = await Post(title="Test post").save(
Карьера в области образования (
    name="Test category1",
    In arguments pass a dictionary with name of the through field and keys
    # Corresponding to through model fields
    postcategory={"sort_order": 1, "param_name": "volume"}.
)

Получение или создание

get_or_create(_defaults: Optional[Dict[str, Any]] = None, **kwargs) -> Tuple[Model, bool]

При попытке получить строку, удовлетворяющую критериям, при возникновении исключения NoMatch создается новая строка с использованием данного kwargs.

!!!tip Читать далее в документе get_or_create

Обновить или создать

update_or_create(**kwargs) -> Model

Обновление модели или создание новой модели без соответствия в базе данных.

!!!tip Читать больше в файле update_or_create

Обновить

update(**kwargs, each:bool = False) -> int

Обновляет связанную модель с использованием параметров ключевых слов, возвращая обновленное количество строк.

Tip

Обратите внимание на то, что параметры с именами полей и словарями полей также могут быть приняты при обновлении связей "Несколько пар".

 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
import databases
import ormar
import sqlalchemy

DATABASE_URL = "sqlite:///test.db"

ormar_base_config = ormar.OrmarConfig(
    database=databases.Database(DATABASE_URL), metadata=sqlalchemy.MetaData()
)


class Category(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="categories")

    id = ormar.Integer(primary_key=True)
    name = ormar.String(max_length=40)


class PostCategory(ormar.Model):
    ormar_config = ormar_base_config.copy(tablename="posts_x_categories")

    id: int = ormar.Integer(primary_key=True)
    sort_order: int = ormar.Integer(nullable=True)
    param_name: str = ormar.String(default="Name", max_length=200)


class Post(ormar.Model):
    ormar_config = ormar_base_config.copy()

    id: int = ormar.Integer(primary_key=True)
    title: str = ormar.String(max_length=200)
    categories = ormar.ManyToMany(Category, through=PostCategory)

В приведенном выше примере можно обновить свойства postcategory при следующем вызове:

1
2
3
categories.filter (name="Test category3")
            postcategory={"sort_order": 4}
        )

Фильтр и сортировка

Фильтр

filter(*args, **kwargs) -> QuerySet

Позволяет использовать фильтры с учетом FK для фильтрации по любым свойствам/полям модели и получения экземпляров.

Tip

Исключить

exclude(*args, **kwargs) -> QuerySet

Работа точно так же, как и фильтр, и все модификаторы (суффикс) одинаковы, но возвращает условие not.

Tip

Основания для заказа

order_by(columns:Union[List, str]) -> QuerySet

Команда order_by () позволяет сортировать результаты в базе данных по выбранным полям.

!!!tip Читать далее в запросе Order_by

Подключение и подзапросы

Выберите связанные

select_related(related: Union[List, str]) -> QuerySet

Позволяет предварительно извлекать связанные модели в ходе одного запроса.

При использовании select_lated всегда выполняется только один запрос к базе данных, что означает, что создается (иногда сложное) соединение, а последующие вложенные модели обрабатываются в Python.

!!!tip Прочитайте больше о select_lated в документации запроса

Предварительный отбор связан

prefetch_related(related: Union[List, str]) -> QuerySet

Позволяет предварительно извлекать связанные модели во время запроса, но в отличие от select_lated каждая последующая модель извлекается в отдельном запросе базы данных.

При использовании prefetch_lated каждая модель выполняет по одному запросу для базы данных, что означает, что вы выполняете несколько запросов один за другим.

!!!tip Читать далее в файле запроса prefetch_lated

Страницы и строки

Страница страницы

paginate(page: int, page_size: int = 20) -> QuerySet

Комбинированы методы смещения и ограничения на основе номера страниц и размера.

Tip

Ограничения

limit(limit_count: int) -> QuerySet

Можно ограничить результат необходимым количеством родительских моделей.

Tip

Компенсация

offset(offset: int) -> QuerySet

Результат можно компенсировать требуемым количеством главной модели.

Tip

Выбор подгруппы столбцов

Область применения

fields(columns: Union[List, str, set, dict]) -> QuerySet

С помощью fields() можно выбрать подмножество столбцов модели для ограничения нагрузки на данные.

Tip

Исключить поля

exclude_fields(columns: Union[List, str, set, dict]) -> QuerySet

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

!!!tip Узнать больше в документации except_fields

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

Количество

count(distinct: bool = True) -> int

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

Tip

Существует

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

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

Tip