Метод модели
Основное взаимодействие!!!tip с базой данных открыто для каждой модели в виде объекта QuerySet, открытого для Model.objects, похожего на django orm.
1 | |
Каждый экземпляр модели имеет набор способов сохранения, обновления или загрузки самого себя.
Доступные методы описаны ниже.
Педантичный метод
Обратите внимание, что каждая модель ormar.Model также является pydantic.BaseModel, поэтому все методы pydantic также могут быть использованы в модели, в частности методы model_dump () и model_dump_json (), которые также могут принимать исключения, включение и другие параметры.
Для получения дополнительной информации ознакомьтесь с документацией pydantic.
Модель_construct ()
model_construct является исходным эквивалентом метода__init__, который используется для построения новых экземпляров.
Разница заключается в том, что модель_construct пропускает проверку, поэтому ее следует использовать, когда вы знаете, что данные верны и достоверны. Преимущество использования конструкции заключается в том, что она ускоряет выполнение, поскольку пропускает проверку.
Примечание!!!Примечание Обратите внимание, что в отличие от метода pydantic.model_construct метод эквивалентности-ormar также будет работать с вложенными связанными моделями.
Предупреждение Помните, что, поскольку проверка пропущена, метод построения не выполняет никаких преобразований, проверок и т. д., поэтому на вас лежит ответственность за предоставление действительных данных для использования в базе данных.
1 2 3 4 | |
Модельный дамб ()
model_dump является методом, унаследованным от pydantic, но ormar добавляет свои собственные аргументы и имеет некоторые нюансы при использовании значений по умолчанию, поэтому для ясности он представлен здесь.
Модель_dump, как следует из названия, экспортирует данные из дерева модели в словарь.
Описание параметра model_dump:
Включить (или изменить)
include: Union[Set, Dict] = None
Набор имен полей или словарь для включения в возвращаемый словарь.
Обратите внимание, что у pydantic есть необычная схема включения/исключения полей из списка через индекс (так же, как и во вложенных моделях). Если вы хотите исключить поля из всех дочерних элементов, вам нужно передать ключ__all__в словарь.
Вы не можете исключить вложенные модели из Sets в pydantic, но можете сделать это в ormar (путем добавления двойного подчеркивания к именам связей, т. е. исключения названий категорий книг, которые вы можете использовать)exclude={"book__category__name"}
Ormar не поддерживает исключение/включение индексов и принимает упрощенные и более удобные для пользователя формы представления.
Чтобы проверить, как включить/исключить поля, включая вложенные поля, просмотрите раздел полей, содержащий пояснения и большое количество примеров.
!!!Обратите внимание, что в ormar вы можете исключить вложенные модели из коллекции, вы можете исключить из всего дерева моделей в response_model_exclude и response_model_include в fastapi!
Исключить (или изменить)
exclude: Union[Set, Dict] = None
Набор или словарь имен полей, которые необходимо исключить из возвращаемого словаря.
Обратите внимание, что у pydantic есть необычная схема включения/исключения полей из списка через индекс (как и во вложенных моделях). Если вы хотите исключить поля из всех дочерних элементов, вам нужно передать ключ__all__в словарь.
Вы не можете исключить вложенные модели из Sets в pydantic, но можете сделать это в ormar (путем добавления двойного подчеркивания к именам связей, т. е. исключения названий категорий книг, которые вы используете)exclude={"book__category__name"})
Ormar не поддерживает исключение/включение индексов и принимает упрощенные и более удобные для пользователя формы представления.
Чтобы проверить, как включить/исключить поля, включая вложенные поля, просмотрите раздел полей, содержащий пояснения и большое количество примеров.
!!!обращает внимание на то, что в ormar вы можете исключить вложенные модели из коллекции, а вы можете исключить из всего дерева моделей в response_model_exclude и response_model_include в fastapi!
Исключить_Отменить настройки
Исключить неустановленные: Логический = False
Flag указывает, следует ли исключить поля, которые не были заданы явно при создании модели, из возвращаемого словаря.
!!!Обратите внимание, что после сохранения данных в базе данных каждое поле имеет свое собственное значение->, которое может быть предоставлено вами, значение по умолчанию или нет.
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 | |
Исключить значения по умолчанию
exclude_defaults: bool = False
Значения флагов, равные значению по умолчанию (независимо от того, установлены они или нет), должны быть исключены из возвращаемого словаря
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 | |
Исключить_Нет
Исключить_Нет: Логический = False
Flag указывает, следует ли исключить поле, равное None, из возвращаемого словаря.
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 | |
except_primary_keys (только ormar)
exclude_primary_keys: bool = False
Если флаг имеет значение True, в дереве будут исключены все ключевые столбцы, включая вложенные модели.
1 2 3 4 5 6 7 8 9 | |
except_through_models (только для ormar)
exclude_through_models: bool = False
Автоматическое добавление сквозных моделей для каждой связи "Мноя-несколько" и сохранение дополнительных параметров в связанной модели/таблице.
При установке except_through_models =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 31 32 33 34 35 36 37 38 39 40 41 | |
Модель_dump_json ()
Модель_dump_json () имеет точно те же параметры, что и модель_dump (), поэтому проверьте приведенное выше.
Конечным результатом, конечно, является строка, представленная json, а не словарь.
Получить_pydantic ()
get_pydantic(include: Union[Set, Dict] = None, exclude: Union[Set, Dict] = None)
Этот метод позволяет генерировать pydantic модель из ормара без необходимости повторного ввода всех полей.
Обратите внимание, что если у вас есть вложенная модель, она создаст для вас все дерево моделей pydantic! Но таким образом, чтобы предотвратить проблемы с циклическими ссылками.
Кроме того, можно передать исключения и/или включить параметры для сохранения только тех полей, которые необходимы, в том числе во вложенных моделях.
Это означает, что вы можете легко создать Pydantic модель для запросов и ответов в fastapi.
!!! Обратите внимание, что для получения дополнительной информации о возможных исключениях/включении и о том, как создать словарь исключений или настройки, посетите раздел Поля документа
Ниже приведен пример модели ormar:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
Вы можете создать Pydantic модель с помощью простого вызова.
1 | |
В результате создается модель, эквивалентная следующему:
1 2 3 | |
!!! Внимание, что иметь несколько классов с тем же именем в одном модуле не является хорошей привычкой, и это может повредить файлу fastapi. Вот почему ormar добавляет случайные три заглавные буквы к классу. В приведенном выше примере это означает, что класс будет называться Category_XIP (BaseModel).
Чтобы исключить или включить вложенные поля, можно использовать словарь или двойное подчеркивание.
1 2 3 | |
Полученная структура выглядит следующим образом.
1 2 3 4 5 6 | |
Конечно, вы также можете использовать глубокие вложенные структуры, и ormar создаст для вас его pydantic эквиваленты (таким образом, чтобы исключить циклы).
Обратите внимание на то, что в модели Item выше нет ссылки на категорию, хотя отношения в ormar являются двунаправленными (и ormar.Item имеет поле категории).
Обратите внимание, что полученная модель pydantic наследует все валидаторы полей от исходной модели ormar, включая аутентификатор выбора ormar и валидатор, определенный с помощью декоритора pydantic.validator.
1 2 | |
Загрузка ()
По умолчанию при запросе таблицы без предварительной извлечения связанной модели ormar будет строить связанные модели, но заполнять их только значением pk. Загрузить связанные модели можно, вызовав метод load().
load() также можно использовать для обновления модели из базы данных, если она была изменена другим процессом.
1 2 3 4 5 6 7 | |
Загрузить все.
load_all(follow: bool = False, exclude: Union[List, str, Set, Dict] = None) -> Model
Метод работает так же, как и метод load(), но он также обходит все отношения модели, которая вызвала метод, и перезагружает их из базы данных.
По умолчанию метод load_all загружает только те модели, которые непосредственно связаны с моделью, к которой он применяется (в одном шаге).
Однако можно задать параметр "follow=True" для прохождения вложенных моделей и загрузки всех их в дерево связей.
Предупреждение Во избежание циклического обновления с использованием параметра "flow =True" load_all сохраняет набор моделей, к которым были применены модели, и не выполняет вложенную загрузку для моделей, к которым они были подключены.
1 2 3 4 5 6 | |
Метод также принимает дополнительные параметры исключения, которые работают точно так же, как и метод исключения полей в QuerySet. Это позволяет удалять поля из обновляемой связанной модели или пропускать всю связанную модель.
Метод выполняет один запрос базы данных и, таким образом, более эффективен, чем вложенные вызовы load() и all() в связанной модели.
!!!tip Для получения дополнительной информации об исключениях см. except_fields
!!!Предупреждение о том, что все связи удалены для load_all (), поэтому при исключении некоторых вложенных моделей они будут пустыми после вызова.
Экономия ()
Save() -> себя
Для создания новой модели можно использовать метод QuerySet.create() или инициализировать модель в виде обычной модели pydantic и вызвать метод save().
save() также можно использовать для сохранения изменений модели, если первичный ключ не задан или модель не существует в базе данных.
Метод save() не проверяет, существует ли модель в базе данных, поэтому при попытке сохранить модель с помощью существующего первичного ключа из выбранного серверного сервера базы данных будет получена ошибка целостности.
1 2 3 4 5 | |
Обновить ()
update(_columns: List[str] = None, **kwargs) -> self
Для обновления модели можно использовать метод QuerySet.update () или обновить свойства модели (поля) и вызвать метод update().
При попытке обновить модель без установки первичного ключа будет генерировано исключение ModelPersistenceError.
Для постоянного сохранения вновь созданной модели используйте команду save() или upsert(**Метод KwARG).
1 2 | |
Чтобы обновить в базе данных только выбранные столбцы модели, укажите список столбцов, которые следует обновить до параметра_columns.
В примере:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
!!!предупреждает, что update() не обновляет экземпляр модели, поэтому если вы измените больше столбцов, чем в входящем списке_columns, экземпляр модели будет иметь значение, отличное от значения базы данных!
Обновить вставку ()
uppsert (**kwargs) -> Я
Это прокси метода save() или update(**kwargs), описанного выше.
Если ключ установлен на->, вызывается метод обновления.
Если pk не задан, вызывается метод save().
1 2 3 4 5 | |
Удалить ()
Для удаления модели можно использовать метод QuerySet.delete () или использовать модель и вызвать метод delete().
1 2 | |
!!!tip Обратите внимание, что объект трассировки остается неизменным и удаляются только записи из базы данных.
Сохранить связанные ()
save_related(follow: bool = False, save_all: bool = False, exclude=Optional[Union[Set, Dict]]) -> None
Метод проходит через все связи модели, к которой он был применен, и вызывает метод upsert() для каждой из несохраненных моделей.
Чтобы узнать, когда модель была сохранена, см. раздел о состоянии сохранения выше.
По умолчанию метод save_lated сохраняет только те модели, которые непосредственно связаны (в один шаг) с моделью, к которой он применяется.
Однако можно задать параметр "follow=True" для прохождения вложенных моделей и сохранения всех их в дереве связей.
По умолчанию save_lated сохраняются только модели в несохраненном состоянии, что означает, что они были изменены в текущем диапазоне.
Если требуется принудительно сохранить все связанные методы, используйте флаг save_all =True, который обновляет все связанные модели, независимо от их статуса сохранения.
Если необходимо пропустить сохранение некоторых связей, можно передать параметры исключения.
Exclude может быть набором собственных моделей отношений или словарем, который может содержать вложенные элементы.
!!!note Обратите внимание, что параметр исключения в save_lated принимает только имена связанных полей, поэтому при передаче каких-либо дополнительных полей они будут сохранены в любом случае.
!!!note Для получения дополнительной информации о структуре возможных значений, передаваемых исключенным, проверьте документацию по методу Queryset.fields.
Предупреждение: Во избежание циклического обновления с использованием параметра follow=True, save_lated сохраняет набор моделей в каждой ветви дерева связей и не выполняет вложенные save_lated для тех моделей, к которым обращаются.
1 | |
Обратите внимание на то, что с помощью save_all =True и Follow=True можно одновременно сохранить все дерево связей с помощью save_lated ().
Примеры:
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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | |
Предупреждает, что save_lated () повторяет все связи и все модели и обновляет их по одному, поэтому он сохраняет все модели, но может оказаться не лучшим с точки зрения количества запросов базы.