Ответить
Вы можете использовать модель ormar в fastapi response_model вместо pydantic.
При желании вы можете также комбинировать ormar.Models с pydantic.
Одной из наиболее распространенных задач в ответах является исключение определенных полей, которые вы не хотите включать в данные ответа.
Это можно сделать несколькими способами в ormar, поэтому вы можете посмотреть на свои варианты ниже и выбрать тот, который лучше всего подходит для вашей ситуации.
Исключить поля из ответов
Необязательное поле
Обратите внимание на то, что каждое дополнительное поле не является обязательным, что означает, что дополнительные поля можно пропустить как в ответе, так и в запросе.
Поля не требуются, если (все/многие/все):
- Поле помечается nullable=True
- Поле имеет значение по умолчанию или функциональную функцию: default="Test"
- Поле задано значение server_default
- Field-это поле autoincrement=Trueprimary_key (Примечание: ormar.Integerprimary_key по умолчанию является autoincrement)
Примеры:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
В приведенном выше примере поля id (это целое число с автоматическим приращением), first_name (с nullable=True) и категория (со значением по умолчанию) являются необязательными, их можно пропустить в ответ, и модель все равно будет проверяться.
Если поле может быть пустым, его не нужно включать в полезную нагрузку во время создания и в ответ, поэтому, основываясь на приведенном выше примере, вы можете:
1 2 3 4 | |
Это означает, что, если вы не передаете имя ie first_name в запросе, он будет проверен правильно (так как поле является необязательным), сохранен в базе данных и возвратит сохраненные записи без этого поля (также будет проверено).
!!!Note Обратите внимание, что, хотя вы не передаете значение поля, само поле по-прежнему существует в response_model, что означает, что оно будет отображаться в данных ответа и будет установлено значение None.
1 | |
FastApi Ответ_модель_Исключения
Fastapi имеет response_model_exclude, который принимает набор (или список) имен полей.
У этого есть свои ограничения, так как ormar и pydantic также принимают словари, в которых можно установить столбцы исключения/включения или на вложенных моделях (подробнее см. ниже).
Предупреждение: обязательное поле нельзя исключить при использовании response_model, так как в процессе проверки может произойти сбой.
1 2 3 | |
Верхняя точка может быть запрошена следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
!! Обратите внимание на то, как поля пароля в приведенном выше примере полностью исчезли из данных ответа.
1 | |
Вложенные модели, исключение
Хотя fastapi позволяет передавать только один набор имен полей, поэтому просто исключается, ormar гораздо умнее при использовании response_model_exclude.
В ormar для исключения вложенных моделей можно использовать два типа обозначений.
Первый представляет собой словарь с вложенными полями, представляющими структуру дерева модели, а второй-путь к именам полей, разделенных двойным подчеркиванием.
Предположим, что наша категория пользователей представляет собой отдельную модель:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
Если вы хотите исключить приоритет из категории ответа, вы все равно можете использовать параметр fastapi.
1 2 3 | |
Обратите внимание, что вы можете использовать двойное подчеркивание для перехода к более глубоким моделям, и если вы хотите исключить несколько полей из вложенной модели, вам нужно добавить полный путь перед ними. В примере response_model_exclude={"category__priority", "category__other_field", category__nested_model__nested_model_field} ETC.
!!!Обратите внимание, что для получения дополнительной информации о возможных исключениях и о том, как создать словарь исключений или настройки, посетите раздел Поля документа
Обратите внимание, что в дополнение к параметру response_model_exclude, fastapi также поддерживает другие параметры, унаследованные от pydantic. Все они также подходят для ormar, но могут иметь некоторые нюансы, поэтому лучше читать раздел dict документа.
Исключено из модели.model_dump ()
Или вы можете просто вернуть словарь из ormar.Model и использовать его.
Таким образом, можно также настроить исключение/включение в качестве словаря и исключить поля из вложенных моделей.
!!!Предупреждение, что отказ от использования response_model приведет к тому, что документ api не будет образцов и шаблонов ответов, поскольку теоретически ответы могут иметь любой формат.
1 2 3 4 5 | |
!!!Обратите внимание, что, даже если вы передаете поле пароля в запросе, в приведенном выше примере поле пароля будет недействительным, но оно все равно будет существовать, поскольку оно является частью схемы ответа, и для него будет установлено значение None.
Если вы хотите полностью исключить это поле таким образом, просто не используйте response_model и исключите его из модели_dump ().
Кроме того, вы можете вернуть только словарь из модели ormar. Таким образом, вы также можете настроить исключение/включение в словарь и исключить поля из вложенных моделей.
!!!Обратите внимание, что теоретически вы теряете проверку ответа здесь, но из-за того, что вы работаете на ormar.Models, данные ответа проверяются после запроса базы данных (так как ормар является pydantic моделью).
Таким образом, если полностью пропустить response_model, вы можете выполнить следующие действия:
1 2 3 4 | |
!!!Обратите внимание, что при пропуске ответа_model теперь можно исключить обязательные поля, так как после возврата ответ больше не проверяется.
1 | |
Создание Pydantic модели из ormar.Model
Поскольку задача исключения полей очень распространена, ormar имеет специальный способ генерировать pydantic модель из существующих ormar.Models без необходимости повторного ввода всех полей.
Метод get_pydantic (), доступный для всех классов модели.
1 2 3 4 5 | |
!!! Обратите внимание, чтобы увидеть больше примеров и узнать больше, посетите раздел get_pydantic документа.
Предупреждение Метод get_pydantic создает все модели в дереве вложенных моделей на основе алгоритма, который позволяет избежать циклов в модели (тот же алгоритм, что и в model_dump (), select_all () и т. д.)
1 2 3 | |
Автономная модель консоли
Конечным решением является создание отдельной pydantic модели вручную. Она работает точно так же, как и обычное приложение fastapi, поэтому вы можете использовать различные модели ответа, запроса и т. д.
Образцы:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |