Loading...
Loading...
Professional Pydantic v2.12 development for data validation, serialization, and type-safe models. Use when working with Pydantic for (1) creating or modifying BaseModel classes, (2) implementing validators and serializers, (3) configuring model behavior, (4) handling JSON schema generation, (5) working with settings management, (6) debugging validation errors, (7) integrating with ORMs or APIs, or (8) any production-grade Python data validation tasks. Includes complete API reference, concept guides, examples, and migration patterns.
npx skill4agent add ghosttypes/ff-5mp-api-py pydantic-devreferences/install.mdreferences/why.mdreferences/migration.mdreferences/concepts/models.mdBaseModelfrom pydantic import BaseModel, Field
class User(BaseModel):
id: int
name: str = Field(min_length=1, max_length=100)
email: str
age: int | None = Nonemodel_validate()model_dump()model_dump_json()frozen=Truereferences/api/base_model/BaseModel.mdreferences/concepts/fields.mdfrom pydantic import BaseModel, Field
from typing import Annotated
class Product(BaseModel):
name: str = Field(description="Product name")
price: Annotated[float, Field(gt=0, description="Price in USD")]
quantity: int = Field(default=0, ge=0)@computed_fieldreferences/api/fields/references/concepts/validators.mdfrom pydantic import BaseModel, field_validator, model_validator
class Account(BaseModel):
username: str
password: str
password_confirm: str
@field_validator('username')
@classmethod
def username_alphanumeric(cls, v):
assert v.isalnum(), 'must be alphanumeric'
return v
@model_validator(mode='after')
def check_passwords_match(self):
if self.password != self.password_confirm:
raise ValueError('passwords do not match')
return selfreferences/api/functional_validators/references/concepts/types.mdintfloatstrboollistdictsettupledatetimedatetimeUUIDreferences/api/types/conint()constr()confloat()EmailStrAnyUrlIPvAnyAddressAwareDatetimeNaiveDatetimeFutureDatePastDateJsonSecretStrPaymentCardNumberFilePathDirectoryPathreferences/concepts/types.mdreferences/concepts/config.mdConfigDictfrom pydantic import BaseModel, ConfigDict
class User(BaseModel):
model_config = ConfigDict(
str_strip_whitespace=True,
validate_assignment=True,
frozen=False,
extra='forbid'
)extravalidate_assignmentfrozenstr_strip_whitespacefrom_attributespopulate_by_namereferences/api/config/ConfigDict.mduser = User.model_validate(data) # Raises ValidationError if invaliduser = User.model_validate_json(json_string)user = User.model_construct(**trusted_data) # Skip validation for performancereferences/errors/validation_errors.mdreferences/concepts/serialization.mduser_dict = user.model_dump()
user_dict = user.model_dump(exclude={'password'})
user_dict = user.model_dump(by_alias=True)json_str = user.model_dump_json()
json_str = user.model_dump_json(indent=2, exclude_none=True)references/api/functional_serializers/references/concepts/json_schema.mdschema = User.model_json_schema()
schema = User.model_json_schema(by_alias=True, mode='serialization')references/api/json_schema/GenerateJsonSchema.mdreferences/concepts/pydantic_settings.mdfrom pydantic_settings import BaseSettings
class Settings(BaseSettings):
database_url: str
api_key: str
debug: bool = False
model_config = ConfigDict(env_file='.env')
settings = Settings()references/api/pydantic_settings/references/examples/orms.mdfrom pydantic import BaseModel, ConfigDict
class UserModel(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: int
name: str
# Convert ORM instance to Pydantic model
user = UserModel.model_validate(sql_user)references/concepts/dataclasses.mdfrom pydantic.dataclasses import dataclass
@dataclass
class User:
id: int
name: strreferences/api/dataclasses/references/concepts/type_adapter.mdfrom pydantic import TypeAdapter
ListOfInts = TypeAdapter(list[int])
validated = ListOfInts.validate_python(['1', '2', '3'])references/api/type_adapter/TypeAdapter.mdreferences/concepts/unions.mdfrom typing import Literal, Union
from pydantic import BaseModel, Field
class Cat(BaseModel):
pet_type: Literal['cat']
meows: int
class Dog(BaseModel):
pet_type: Literal['dog']
barks: float
class Owner(BaseModel):
pet: Union[Cat, Dog] = Field(discriminator='pet_type')references/concepts/alias.mdfrom pydantic import BaseModel, Field
class User(BaseModel):
username: str = Field(alias='userName')references/api/aliases/references/concepts/strict_mode.mdfrom pydantic import BaseModel, ConfigDict
class StrictModel(BaseModel):
model_config = ConfigDict(strict=True)
count: int # Won't accept '123', only 123references/concepts/performance.mdreferences/errors/validation_errors.mdfrom pydantic import ValidationError
try:
user = User(**data)
except ValidationError as e:
print(e.errors()) # List of error dictionaries
print(e.json()) # JSON formatted errorsreferences/errors/errors.mdreferences/errors/usage_errors.mdreferences/api/base_model/references/api/fields/references/api/config/references/api/types/references/api/functional_validators/references/api/functional_serializers/references/api/json_schema/references/api/dataclasses/references/api/type_adapter/references/api/errors/references/api/networks/references/api/aliases/references/api/validate_call/references/api/version/references/examples/custom_validators.mdreferences/examples/orms.mdreferences/examples/files.mdreferences/examples/requests.mdreferences/examples/queues.mdreferences/examples/dynamic_models.mdreferences/integrations/linting.mdField()validate_assignmentfrozen=Trueextra='forbid'ValidationErrormodel_construct()model_dump()references/migration.mddef test_user_validation():
# Test valid data
user = User(id=1, name="Test", email="test@example.com")
assert user.id == 1
# Test invalid data
with pytest.raises(ValidationError):
User(id="invalid", name="Test")references/index.mdreferences/help_with_pydantic.mdreferences/version-policy.mdreferences/contributing.mdreferences/migration.md