Параметр populate_by_name
Параметр populate_by_name задаётся в классе
ConfigDict модели Pydantic и управляет тем,
как заполняются поля при создании модели.
По умолчанию, если для поля задан псевдоним
через Field(alias='...'), то модель принимает
данные только по псевдониму.
Когда populate_by_name=True, модель принимает
данные и по псевдониму, и по имени атрибута.
Это удобно при работе с внешними API, где имена
полей отличаются от имён атрибутов в коде.
Синтаксис
from pydantic import BaseModel, ConfigDict
class Model(BaseModel):
model_config = ConfigDict(populate_by_name=True)
field: str = Field(alias='alias_name')
Пример
Давайте создадим модель с псевдонимом и
включённым populate_by_name:
from fastapi import FastAPI
from pydantic import BaseModel, ConfigDict, Field
app = FastAPI()
class User(BaseModel):
model_config = ConfigDict(populate_by_name=True)
username: str = Field(alias='user_name')
@app.post('/user/')
def create_user(user: User):
return user
Теперь модель можно заполнить как по псевдониму
'user_name', так и по имени 'username'.
Отправим запрос с псевдонимом:
{"user_name": "abcde"}
Результат выполнения кода:
Пример
Теперь отправим запрос с именем атрибута:
{"username": "abcde"}
Результат выполнения кода:
{"username": "abcde"}
Если бы populate_by_name был выключен,
второй запрос вернул бы ошибку валидации,
так как поле ожидалось только под псевдонимом.
Пример
Давайте посмотрим, как выглядит ошибка при выключенном параметре:
from fastapi import FastAPI
from pydantic import BaseModel, ConfigDict, Field
app = FastAPI()
class User(BaseModel):
model_config = ConfigDict(populate_by_name=False)
username: str = Field(alias='user_name')
@app.post('/user/')
def create_user(user: User):
return user
Запрос с именем атрибута:
{"username": "abcde"}
Результат выполнения кода:
{"detail": [{"type": "missing", "loc": ["body", "user_name"], "msg": "Field required", "input": {"username": "abcde"}}]}
Смотрите также
-
класс
BaseModel,
от которого наследуются все модели Pydantic -
параметр
ConfigDict,
который хранит настройки модели -
класс
Field,
который задаёт псевдонимы и валидацию полей -
параметр
from_attributes,
который разрешает создавать модель из атрибутов объекта