Pydantic Migration Guides

How to replace @validator with @field_validator in Pydantic v2

Fix simple Pydantic validator migrations and keep signature-heavy cases out of the automatic path.

Start here

The safe first move

If the validator uses the supported direct-import path and the simple classmethod signature, the clean rewrite is @field_validator.

Stop before automation when: Validators that use values, field, config, each_item, or always. Alias-heavy imports.

Target shape

from pydantic import BaseModel, field_validator

class UserModel(BaseModel):
    email: str

    @field_validator("email")
    def normalize_email(cls, value: str) -> str:
        return value.strip().lower()

Repo fit check

Want to know if your repo has this pattern?

Run the matching scanner locally first. Read the free findings and manual alternatives; consider paid cleanup only if supported patterns repeat enough to justify the price.

  • Local scan; no repository upload.
  • Supported findings are separated from manual-review findings.
  • Buy only when the repeated pattern is worth automating.
Run the Pydantic scan first View example report See when to buy
Example scan summary
supported_findings: 38
manual_review_findings: 6
files_uploaded: 0
confidence: reviewable

Why this page exists

How to replace @validator with @field_validator in Pydantic v2

Direct imports and simple validator signatures are good automation targets. The rest should stop cleanly.

Direct answer

What changes

If the validator uses the supported direct-import path and the simple classmethod signature, the clean rewrite is @field_validator.

Example

Before and after

Before

from pydantic import BaseModel, validator

class UserModel(BaseModel):
    email: str

    @validator("email")
    def normalize_email(cls, value: str) -> str:
        return value.strip().lower()

After

from pydantic import BaseModel, field_validator

class UserModel(BaseModel):
    email: str

    @field_validator("email")
    def normalize_email(cls, value: str) -> str:
        return value.strip().lower()

Decision path

If this repeats across the repo, open the evaluation pages next.

The cleanup pack is strongest when the repo still uses direct pydantic imports and a clean validator/settings/config subset.

  • The repo has direct pydantic or pydantic.v1 imports, BaseSettings usage, safe Config blocks, or simple validators.
  • The migration pain is repetitive v1-to-v2 cleanup, not a custom semantic rewrite.
  • If the scan output is ambiguous, review its findings and upstream guidance. Do not buy expecting unsupported cases to be resolved.

Typical symptoms

  • The repo still imports validator from pydantic or pydantic.v1.
  • Simple validators are mixed with a smaller hard bucket.
  • Teams want deterministic migration first.

What the product covers

  • Direct validator to field_validator rewrites.
  • Repo reporting for supported files.
  • Links to related Pydantic guides.

Manual-review boundary

  • Validators that use values, field, config, each_item, or always.
  • Alias-heavy imports.
  • Decorator wrappers and meta-programming.

FAQ

Fast answers before you decide

What is the safest fix for validator field_validator pydantic v2?

If the validator uses the supported direct-import path and the simple classmethod signature, the clean rewrite is @field_validator.

Can validator field_validator pydantic v2 be automated?

Automate only the supported subset: Direct validator to field_validator rewrites. Repo reporting for supported files. Links to related Pydantic guides. Keep these cases in manual review: Validators that use values, field, config, each_item, or always. Alias-heavy imports. Decorator wrappers and meta-programming.

When should I buy Pydantic v1 to v2 Migration Cleanup Pack?

Use Pydantic v1 to v2 Migration Cleanup Pack only when this pattern repeats across enough files that manual cleanup is still costly. Use the free report and upstream guide to evaluate fit. Buy only if repeated supported edits justify the price; no paid assessment is required.

Purchase fit

Choose the lowest-risk next step.

One matching page is not enough by itself. Run the local scan, then buy only when the same supported pattern appears often enough to matter.

Buy if

  • The repo has direct pydantic or pydantic.v1 imports, BaseSettings usage, safe Config blocks, or simple validators.
  • The migration pain is repetitive v1-to-v2 cleanup, not a custom semantic rewrite.
  • The team accepts manual-review findings for alias-heavy imports and signature-heavy validators.

What the workflow includes

  • Installable local CLI workflow, not a hosted black box.
  • Supported validator, settings, import, and config rewrites.
  • Demo report, public proof, coverage notes, rollback checklist, and buyer terms.

Before checkout

  • Stripe Checkout handles secure payment and receipts.
  • Download your purchased ZIP after payment.
  • Runs locally; no hosted API, repo upload, or production credentials needed.
  • The free report includes the evidence needed to evaluate fit. Paid summary and template add-ons are optional.
  • 14-day refund review for published-scope or delivery mismatches.