Типы (Types)#
Модуль: restalchemy.dm.types
Типы DM описывают допустимые значения для свойств и то, как значения конвертируются в простые типы (для JSON, OpenAPI, storage и т.д.).
Все типы наследуются от BaseType.
BaseType#
BaseType#
Базовый интерфейс для всех DM-типов:
validate(value) -> bool: проверяет допустимость значения.to_simple_type(value): конвертирует значение в простой Python-тип (строка, число, dict, list и т.п.).from_simple_type(value): обратная конвертация из простого типа.from_unicode(value): разбор строкового представления.to_openapi_spec(prop_kwargs): формирует фрагмент схемы OpenAPI.
Многие конкретные типы основаны на BasePythonType, который оборачивает Python-типы (int, str и др.).
Скалярные типы#
Boolean#
- Оборачивает
bool. - Поддерживает конвертацию из простых значений и строковых представлений.
String#
- Оборачивает
strс ограничениями по длине. - Параметры:
min_length,max_length. to_openapi_spec()добавляетminLength/maxLength.
Подклассы:
Email— валидирует email-адреса (при желании — с проверкой доставляемости).
Integer#
- Оборачивает
intсmin_valueиmax_value. - Есть специализированные варианты (
Int8и т.п.).
Float#
- Оборачивает
floatс границами.
Decimal#
- Оборачивает
decimal.Decimalс опциональнымmax_decimal_places. - Сохраняет точность, сериализуя в строку.
UUID#
- Оборачивает
uuid.UUID. - Сериализует в строку.
Enum#
- Ограничивает значение фиксированным набором допустимых значений.
Пример:
Использование в свойстве:
Дата и время#
UTCDateTimeZ#
- Оборачивает
datetime.datetimeи требуетtzinfo == datetime.timezone.utc. - Сериализует в строку в формате MySQL / RFC3339-подобном.
- Наивный
UTCDateTime, забиравший ту зону, которую называла хранимая строка, удалён в 16.0.0. Он читал и писал те же два формата, поэтому свойство, объявленное через него, становитсяUTCDateTimeZ, а хранимые значения читаются без изменений — как UTC, чем их и считали.
TimeDelta#
- Оборачивает
datetime.timedelta. - Сериализует в количество секунд (float).
DateTime#
- Устаревший тип, сериализующийся в Unix timestamp.
Коллекции#
List и TypedList#
Listпроверяет, что значение — список.TypedList(nested_type)проверяет, что каждый элемент соответствуетnested_type.
Пример:
Dict и структурированные dict#
Dictпроверяет, что значение —dictсо строковыми ключами.TypedDict(nested_type)требует, чтобы все значения соответствовалиnested_type.
Dict на основе схемы:
SoftSchemeDict(scheme)— ключи должны быть подмножеством схемы.SchemeDict(scheme)— множество ключей должно строго совпадать со схемой.
Пример:
from restalchemy.dm import types
settings_scheme = {
"retries": types.Integer(min_value=0),
"timeout": types.Float(min_value=0.0),
}
settings_type = types.SoftSchemeDict(settings_scheme)
Использование в property:
Nullable и обёртки#
AllowNone(nested_type)#
- Разрешает либо
None, либо значение, валидное дляnested_type. to_simple_type()/from_simple_type()делегируют вnested_type, если значение неNone.to_openapi_spec()добавляетnullable: true.
Пример:
Регулярные выражения и URL-типы#
BaseRegExpType и BaseCompiledRegExpTypeFromAttr#
Базовые классы для типов, валидирующих строки по регулярному выражению.
Конкретные типы:
Uri— URI-путь, заканчивающийся на UUID.Mac— MAC-адрес.Hostname(устаревший) — см.types_network.Url— HTTP/FTP URL.
Динамические и сетевые типы#
Дополнительные специализированные типы находятся в:
restalchemy.dm.types_dynamicrestalchemy.dm.types_network
Там можно найти:
- Более сложные типы для хостнеймов, сетей, подсетей.
- Динамические структуры со схемой, определяемой в рантайме.
Общий шаблон использования всегда один:
- Создать экземпляр типа.
- Использовать его в
properties.property(). - Полагаться на DM-валидацию и конвертацию.
Рекомендации#
- Используйте DM-типы (
types.String,types.Integerи др.), а не "сырой" Python-тип. - Применяйте
AllowNone, если поле действительно допускаетNone. - Используйте
Enumдля небольших фиксированных наборов значений. - Для сложных JSON-подобных структур предпочитайте
SoftSchemeDict,SchemeDictилиTypedDict, а не голыйDict.