Псевдонимы
Псевдоним — это альтернативное имя поля, используемое при сериализации и десериализации данных.
Указать псевдоним можно следующими способами:
alias
вField
- должна быть
str
- должна быть
validation_alias
вField
- может быть экземпляром
str
,AliasPath
илиAliasChoices
- может быть экземпляром
serialization_alias
вField
- должна быть
str
- должна быть
alias_generator
вConfig
- может быть вызываемым объектом или экземпляром
AliasGenerator
- может быть вызываемым объектом или экземпляром
Примеры использования alias
, validation_alias
serialization_alias
см. в разделе Псевдонимы полей .
AliasPath
и AliasChoices
¶
Документация по API
Pydantic предоставляет два специальных типа для удобства при использовании validation_alias
: AliasPath
и AliasChoices
.
AliasPath
используется для указания пути к полю с использованием псевдонимов. Например:
from pydantic import BaseModel, Field, AliasPath
class User(BaseModel):
first_name: str = Field(validation_alias=AliasPath('names', 0))
last_name: str = Field(validation_alias=AliasPath('names', 1))
user = User.model_validate({'names': ['John', 'Doe']}) # (1)!
print(user)
#> first_name='John' last_name='Doe'
- Мы используем
model_validate
для проверки словаря с использованием псевдонимов полей.
Более подробную информацию о model_validate
можно найти в справочнике по API.
В поле 'first_name'
мы используем псевдоним 'names'
и индекс 0
, чтобы указать путь к имени. В поле 'last_name'
мы используем псевдоним 'names'
и индекс 1
, чтобы указать путь к фамилии.
AliasChoices
используется для указания выбора псевдонимов. Например:
from pydantic import BaseModel, Field, AliasChoices
class User(BaseModel):
first_name: str = Field(validation_alias=AliasChoices('first_name', 'fname'))
last_name: str = Field(validation_alias=AliasChoices('last_name', 'lname'))
user = User.model_validate({'fname': 'John', 'lname': 'Doe'}) # (1)!
print(user)
#> first_name='John' last_name='Doe'
user = User.model_validate({'first_name': 'John', 'lname': 'Doe'}) # (2)!
print(user)
#> first_name='John' last_name='Doe'
- Мы используем второй вариант псевдонима для обоих полей.
- Мы используем первый вариант псевдонима для поля
'first_name'
и второй вариант псевдонима для поля'last_name'
.
Вы также можете использовать AliasChoices
с AliasPath
:
from pydantic import BaseModel, Field, AliasPath, AliasChoices
class User(BaseModel):
first_name: str = Field(validation_alias=AliasChoices('first_name', AliasPath('names', 0)))
last_name: str = Field(validation_alias=AliasChoices('last_name', AliasPath('names', 1)))
user = User.model_validate({'first_name': 'John', 'last_name': 'Doe'})
print(user)
#> first_name='John' last_name='Doe'
user = User.model_validate({'names': ['John', 'Doe']})
print(user)
#> first_name='John' last_name='Doe'
user = User.model_validate({'names': ['John'], 'last_name': 'Doe'})
print(user)
#> first_name='John' last_name='Doe'
Использование генераторов псевдонимов¶
Вы можете использовать параметр alias_generator
в Config
, чтобы указать вызываемый объект (или группу вызываемых объектов через AliasGenerator
), который будет генерировать псевдонимы для всех полей в модели. Это полезно, если вы хотите использовать единое соглашение об именах для всех полей в модели, но не хотите указывать псевдоним для каждого поля отдельно.
!!! note Примечание Pydantic предлагает три встроенных генератора псевдонимов, которые можно использовать сразу после установки:
[`to_pascal`][pydantic.alias_generators.to_pascal]<br>
[`to_camel`][pydantic.alias_generators.to_camel]<br>
[`to_snake`][pydantic.alias_generators.to_snake]<br>
Использование вызываемого объекта¶
Вот базовый пример использования вызываемого объекта:
from pydantic import BaseModel, ConfigDict
class Tree(BaseModel):
model_config = ConfigDict(
alias_generator=lambda field_name: field_name.upper()
)
age: int
height: float
kind: str
t = Tree.model_validate({'AGE': 12, 'HEIGHT': 1.2, 'KIND': 'oak'})
print(t.model_dump(by_alias=True))
#> {'AGE': 12, 'HEIGHT': 1.2, 'KIND': 'oak'}
Использование генератора AliasGenerator
¶
Документация по API
AliasGenerator
— это класс, который позволяет указать несколько генераторов псевдонимов для модели. Вы можете использовать AliasGenerator
, чтобы указать различные генераторы псевдонимов для проверки и сериализации.
Это особенно полезно, если вам нужно использовать разные соглашения об именах для загрузки и сохранения данных, но вы не хотите указывать псевдонимы проверки и сериализации для каждого поля отдельно.
Например:
from pydantic import AliasGenerator, BaseModel, ConfigDict
class Tree(BaseModel):
model_config = ConfigDict(
alias_generator=AliasGenerator(
validation_alias=lambda field_name: field_name.upper(),
serialization_alias=lambda field_name: field_name.title(),
)
)
age: int
height: float
kind: str
t = Tree.model_validate({'AGE': 12, 'HEIGHT': 1.2, 'KIND': 'oak'})
print(t.model_dump(by_alias=True))
#> {'Age': 12, 'Height': 1.2, 'Kind': 'oak'}
Приоритет псевдонимов¶
Если вы укажете alias
в поле Field
, он будет иметь приоритет над сгенерированным псевдонимом по умолчанию:
from pydantic import BaseModel, ConfigDict, Field
def to_camel(string: str) -> str:
return ''.join(word.capitalize() for word in string.split('_'))
class Voice(BaseModel):
model_config = ConfigDict(alias_generator=to_camel)
name: str
language_code: str = Field(alias='lang')
voice = Voice(Name='Filiz', lang='tr-TR')
print(voice.language_code)
#> tr-TR
print(voice.model_dump(by_alias=True))
#> {'Name': 'Filiz', 'lang': 'tr-TR'}
Приоритет псевдонимов¶
Вы можете установить alias_priority
для поля, чтобы изменить это поведение:
alias_priority=2
псевдоним не будет переопределен генератором псевдонимов.alias_priority=1
псевдоним будет переопределен генератором псевдонимов.alias_priority
не установлен:- установлен псевдоним: псевдоним не будет переопределен генератором псевдонимов.
- псевдоним не установлен: псевдоним будет переопределен генератором псевдонимов.
Тот же приоритет применяется к validation_alias
serialization_alias
. Дополнительную информацию о различных псевдонимах полей см. в разделе «Псевдонимы полей» .
本文总阅读量次