Параметр from_attributes
Параметр from_attributes передаётся в
model_config
или в функцию ConfigDict и разрешает создавать экземпляр модели
из произвольного объекта, а не только из словаря или JSON.
Когда параметр включён, Pydantic читает значения полей из атрибутов
переданного объекта с теми же именами, что и у полей модели.
Это удобно, например, при работе с ORM-объектами, у которых данные
хранятся в виде атрибутов, а не в виде словаря.
Значением параметра является булево значение: True или False.
По умолчанию параметр выключен.
Синтаксис
model_config = ConfigDict(from_attributes=True)
Пример
Давайте создадим модель с включённым параметром from_attributes
и построим её из обычного объекта:
from pydantic import BaseModel, ConfigDict
class User(BaseModel):
model_config = ConfigDict(from_attributes=True)
name: str
age: int
class Profile:
def __init__(self, name, age):
self.name = name
self.age = age
profile = Profile('abcde', 25)
user = User.model_validate(profile)
print(user)
Результат выполнения кода:
name='abcde' age=25
Пример
Давайте сравним поведение модели без параметра from_attributes
при попытке построить её из объекта:
Результат выполнения кода:
2 validation errors for User
name
Input should be a valid string [type=string_type, input_value=<__main__.Profile object at 0x...>, input_type=Profile]
For further information visit https://errors.pydantic.dev/2.0/v/string_type
age
Input should be a valid integer [type=int_type, input_value=<__main__.Profile object at 0x...>, input_type=Profile]
For further information visit https://errors.pydantic.dev/2.0/v/int_type
Пример
Давайте используем модель с from_attributes в маршруте FastAPI,
чтобы вернуть данные из ORM-подобного объекта:
from fastapi import FastAPI
from pydantic import BaseModel, ConfigDict
app = FastAPI()
class User(BaseModel):
model_config = ConfigDict(from_attributes=True)
name: str
age: int
class Profile:
def __init__(self, name, age):
self.name = name
self.age = age
@app.get('/user')
def get_user():
profile = Profile('abcde', 25)
user = User.model_validate(profile)
return user
Результат выполнения кода для адреса /user:
{"name": "abcde", "age": 25}
Смотрите также
-
класс
BaseModel,
который является базой для всех моделей Pydantic -
параметр
ConfigDict,
который задаёт настройки модели -
метод
model_validate,
который создаёт модель из объекта или словаря -
метод
model_dump,
который превращает модель в словарь