from __future__ import annotations from typing import Union, Optional from pydantic import BaseModel, PositiveInt, field_validator, Field, ValidationError class User(BaseModel): name: str surname: str age: int registered: bool class UserNone(BaseModel): # preferred variant name: str surname: str age: int | None registered: bool = False class UserUnion(BaseModel): name: str surname: str age: Union[int, None] = None registered: bool = False class UserOptional(BaseModel): name: str surname: str age: Optional[int] # default value is None registered: bool = False class UserPositiveInt(BaseModel): name: str surname: str age: Union[PositiveInt, None] = None registered: bool = False class UserFieldValidator(BaseModel): name: str surname: str age: int | None registered: bool = False @field_validator("age") def validate_age(cls, value): if value < 0: raise ValidationError("age must be positive") if value < 18: raise ValidationError("age must be at least 18") return value class UserMaxLength(BaseModel): name: str = Field(..., max_length=10) surname: str = Field(..., max_length=12) age: int | None registered: bool = False @field_validator("age") def check_age(cls, value): if value < 0: raise ValidationError("age must be positive") if value < 18: raise ValidationError("You are too young to register") return value