Перейти к содержанию

Псевдонимы

Псевдоним — это альтернативное имя поля, используемое при сериализации и десериализации данных.

Указать псевдоним можно следующими способами:

  • alias в Field
    • должна быть str
  • validation_alias в Field
  • serialization_alias в Field
    • должна быть str
  • alias_generator в Config
    • может быть вызываемым объектом или экземпляром AliasGenerator

Примеры использования alias , validation_alias serialization_alias см. в разделе Псевдонимы полей .

AliasPath и AliasChoices

Документация по API

pydantic.aliases.AliasPath
pydantic.aliases.AliasChoices

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'
  1. Мы используем 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'
  1. Мы используем второй вариант псевдонима для обоих полей.
  2. Мы используем первый вариант псевдонима для поля '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

pydantic.aliases.AliasGenerator

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 . Дополнительную информацию о различных псевдонимах полей см. в разделе «Псевдонимы полей» .


本文总阅读量