{"id":140,"library":"pydantic","title":"Pydantic","description":"The most widely used Python data validation library. Powers OpenAI SDK, Anthropic SDK, LangChain, FastAPI, LlamaIndex, and hundreds of other libraries. V2 released June 2023 — a near-complete rewrite in Rust via pydantic-core, 4-50x faster than V1. Current version is 2.12.5 (Mar 2026). V1 security fixes ended June 2024. V3 planned roughly annually.","status":"active","version":"2.12.5","language":"python","source_language":"en","source_url":"https://github.com/pydantic/pydantic","tags":["pydantic","validation","python","data-models","fastapi","llm","type-hints"],"install":[{"cmd":"pip install pydantic","lang":"bash","label":"Python (core, V2)"},{"cmd":"pip install 'pydantic[email]'","lang":"bash","label":"Python (with email validation)"},{"cmd":"pip install pydantic-settings","lang":"bash","label":"Python (settings management — separate package in V2)"}],"dependencies":[{"reason":"Rust-based core engine. Installed automatically. Do not pin separately.","package":"pydantic-core","optional":false},{"reason":"BaseSettings moved to separate package in V2. Required for settings/env var management.","package":"pydantic-settings","optional":true},{"reason":"Required for EmailStr type. Install via pydantic[email].","package":"email-validator","optional":true}],"imports":[{"note":"@validator is deprecated in V2, removed in V3. Use @field_validator. Must add @classmethod decorator in V2.","wrong":"from pydantic import BaseModel, validator\n\nclass User(BaseModel):\n    name: str\n\n    @validator('name')\n    def validate_name(cls, v):\n        return v","symbol":"BaseModel","correct":"from pydantic import BaseModel, field_validator, model_validator\n\nclass User(BaseModel):\n    name: str\n    age: int\n\n    @field_validator('age')\n    @classmethod\n    def age_must_be_positive(cls, v):\n        if v <= 0:\n            raise ValueError('age must be positive')\n        return v"},{"note":"@root_validator deprecated in V2, removed in V3. Use @model_validator(mode='before') or mode='after'.","wrong":"from pydantic import BaseModel, root_validator\n\nclass User(BaseModel):\n    @root_validator(pre=True)\n    def check_root(cls, values):\n        return values","symbol":"model_validator","correct":"from pydantic import BaseModel, model_validator\n\nclass User(BaseModel):\n    name: str\n    age: int\n\n    @model_validator(mode='before')\n    @classmethod\n    def check_root(cls, values):\n        return values"},{"note":"Inner Config class deprecated in V2. Use model_config = ConfigDict(...). orm_mode renamed to from_attributes.","wrong":"from pydantic import BaseModel\n\nclass User(BaseModel):\n    class Config:\n        orm_mode = True","symbol":"ConfigDict","correct":"from pydantic import BaseModel, ConfigDict\n\nclass User(BaseModel):\n    model_config = ConfigDict(from_attributes=True)\n    name: str"},{"note":"BaseSettings moved to separate pydantic-settings package in V2. ImportError if using old import.","wrong":"from pydantic import BaseSettings","symbol":"BaseSettings","correct":"from pydantic_settings import BaseSettings\n\nclass Settings(BaseSettings):\n    api_key: str\n    model_config = ConfigDict(env_file='.env')"}],"quickstart":{"code":"from pydantic import BaseModel, field_validator, ConfigDict\n\nclass User(BaseModel):\n    model_config = ConfigDict(from_attributes=True)\n\n    name: str\n    age: int\n\n    @field_validator('age')\n    @classmethod\n    def age_positive(cls, v):\n        assert v > 0, 'age must be positive'\n        return v\n\nuser = User(name='Alice', age=30)\nprint(user.model_dump())  # not .dict()\nprint(user.model_dump_json())  # not .json()","lang":"python","description":"Pydantic V2 style model with field validator and config."},"warnings":[{"fix":"Replace @validator('field') with @field_validator('field') and add @classmethod decorator.","message":"@validator decorator is deprecated in V2 and will be removed in V3. LLMs trained on pre-2023 data consistently generate @validator code. Raises PydanticDeprecatedSince20 warning.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"@model_validator(mode='before') replaces @root_validator(pre=True). @model_validator(mode='after') replaces @root_validator(pre=False).","message":"@root_validator deprecated in V2, removed in V3. Replace with @model_validator(mode='before') or @model_validator(mode='after').","severity":"breaking","affected_versions":">= 2.0"},{"fix":"from pydantic import ConfigDict; model_config = ConfigDict(from_attributes=True)","message":"Inner class Config: is deprecated. Use model_config = ConfigDict(...) at class level.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"model_config = ConfigDict(from_attributes=True)","message":"orm_mode = True renamed to from_attributes = True in ConfigDict.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"user.model_dump() not user.dict(). user.model_dump_json() not user.json().","message":".dict() method deprecated. Use .model_dump() instead. .json() deprecated, use .model_dump_json().","severity":"breaking","affected_versions":">= 2.0"},{"fix":"User.model_validate(data) not User.parse_obj(data).","message":"parse_obj() and parse_raw() removed. Use model_validate() and model_validate_json() instead.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"pip install pydantic-settings; from pydantic_settings import BaseSettings","message":"BaseSettings moved to separate pydantic-settings package. 'from pydantic import BaseSettings' raises ImportError in V2.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"Field(pattern=r'^\\d+$') not Field(regex=r'^\\d+$')","message":"Field(regex=...) renamed to Field(pattern=...) in V2.","severity":"breaking","affected_versions":">= 2.0"},{"fix":"Migrate fully to V2. Use pydantic.v1 only as a temporary bridge.","message":"V1 compat layer available via 'from pydantic.v1 import BaseModel' for gradual migration. But mixing V1 and V2 BaseModel in same codebase causes hard-to-debug errors.","severity":"gotcha","affected_versions":">= 2.0"},{"fix":"Ensure Python >= 3.8. Check pydantic-core wheel availability for your platform.","message":"pydantic-core is a Rust extension. On unsupported platforms or Python versions, installation fails with no binary wheel available. Requires Python 3.8+.","severity":"gotcha","affected_versions":">= 2.0"}],"env_vars":null,"last_verified":"2026-05-12T08:25:46.873Z","next_check":"2026-06-24T00:00:00.000Z","problems":[{"fix":"Replace `.dict()` with `.model_dump()` to serialize models to a Python dictionary, or `.model_dump_json()` to get a JSON string.","cause":"In Pydantic V2, the `.dict()` method on `BaseModel` instances has been renamed and replaced by `.model_dump()` to avoid confusion with Python's built-in `dict()` function and to support new serialization features.","error":"AttributeError: 'BaseModel' object has no attribute 'dict'"},{"fix":"For forward references, use string literal annotations (e.g., `a: 'MyModel'`) and ensure `from __future__ import annotations` is imported for Python versions older than 3.9. If necessary, call `YourModel.model_rebuild()` after all related models are defined.","cause":"This error occurs when a type annotation refers to a class or type hint that has not yet been defined in the current scope, often due to forward references, circular imports, or simple typos.","error":"PydanticUndefinedAnnotation: name 'YourType' is not defined"},{"fix":"Update imports from `pydantic` to use the new validator decorators, e.g., `from pydantic import field_validator` or `from pydantic import model_validator`. Also, ensure other V1-specific imports or configurations are updated according to the V2 migration guide.","cause":"Pydantic V2 introduced significant changes, including renaming and reorganizing modules and functions. The `@validator` decorator from V1 has been replaced by `@field_validator` and `@model_validator` in V2, requiring an update to import paths and usage.","error":"PydanticImportError: cannot import name 'validator' from 'pydantic'"},{"fix":"Inspect the `loc` and `type` fields within the `ValidationError.errors()` output to identify the exact field and reason for the failure, then adjust the input data to match the expected type and constraints of the Pydantic model.","cause":"This is a general validation error indicating that the input data provided for a specific field does not conform to its declared type or any defined constraints (e.g., an integer field received a non-integer string).","error":"ValidationError: 1 validation error for ModelName field_name Input should be a valid integer [type=int_parsing,...]"},{"fix":"Replace the deprecated `regex` argument in `Field()` with `pattern`, like `field_name: str = Field(pattern='your_regex_pattern')`. Review the V2 migration guide for other renamed `Field` arguments (e.g., `min_items` to `min_length`).","cause":"In Pydantic V2, several keyword arguments for the `Field` function were renamed or removed for consistency and clarity. Specifically, `regex` was replaced by `pattern` to specify regular expression constraints.","error":"PydanticUserError: Field 'x' has 'regex' set but 'pattern' should be used instead"}],"ecosystem":"pypi","meta_description":null,"install_score":100,"install_tag":"verified","quickstart_score":80,"quickstart_tag":"verified","pypi_latest":null,"install_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.27,"mem_mb":8.5,"disk_size":"31.3M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.28,"mem_mb":8.5,"disk_size":"27.7M"},{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.28,"mem_mb":8.5,"disk_size":"28.4M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.2,"mem_mb":8.4,"disk_size":"31M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.18,"mem_mb":8.4,"disk_size":"27M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.19,"mem_mb":8.5,"disk_size":"28M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.45,"mem_mb":9.5,"disk_size":"34.4M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.46,"mem_mb":9.5,"disk_size":"30.3M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.45,"mem_mb":9.5,"disk_size":"31.1M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.38,"mem_mb":9.5,"disk_size":"34M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.37,"mem_mb":9.5,"disk_size":"30M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.37,"mem_mb":9.5,"disk_size":"31M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.65,"mem_mb":9.5,"disk_size":"26.0M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.66,"mem_mb":9.5,"disk_size":"22.0M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.63,"mem_mb":9.5,"disk_size":"22.8M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.63,"mem_mb":9.5,"disk_size":"26M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.64,"mem_mb":9.5,"disk_size":"22M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.59,"mem_mb":9.5,"disk_size":"22M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.25,"mem_mb":6.4,"disk_size":"25.6M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":6.4,"disk_size":"21.6M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":6.4,"disk_size":"22.4M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":6.4,"disk_size":"25M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.25,"mem_mb":6.4,"disk_size":"21M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":6.4,"disk_size":"22M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.25,"mem_mb":8.3,"disk_size":"30.5M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.26,"mem_mb":8.3,"disk_size":"27.2M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.24,"mem_mb":8.3,"disk_size":"27.8M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"email","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.24,"mem_mb":8.3,"disk_size":"30M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.24,"mem_mb":8.3,"disk_size":"27M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"default","exit_code":0,"wheel_type":null,"failure_reason":null,"install_time_s":null,"import_time_s":0.24,"mem_mb":8.3,"disk_size":"27M"}]},"quickstart_checks":{"last_tested":"2026-05-12","tag":"verified","tag_description":"quickstart runs on critical runtimes, recently tested","results":[{"runtime":"python:3.10-alpine","exit_code":0},{"runtime":"python:3.10-slim","exit_code":0},{"runtime":"python:3.11-alpine","exit_code":0},{"runtime":"python:3.11-slim","exit_code":0},{"runtime":"python:3.12-alpine","exit_code":0},{"runtime":"python:3.12-slim","exit_code":0},{"runtime":"python:3.13-alpine","exit_code":0},{"runtime":"python:3.13-slim","exit_code":0},{"runtime":"python:3.9-alpine","exit_code":0},{"runtime":"python:3.9-slim","exit_code":0}]}}