Annotated + Field adds validation metadata to type hints.
1from typing import Annotated2from pydantic import Field, BaseModel34# Basic usage5def create_user(6 name: Annotated[str, Field(min_length=1, max_length=100)],7 age: Annotated[int, Field(ge=0, le=150)],8 email: Annotated[str, Field(pattern=r"^\S+@\S+$")],9):10 return {"name": name, "age": age, "email": email}1112# With Pydantic models13class User(BaseModel):14 name: Annotated[str, Field(min_length=1)]15 age: Annotated[int, Field(ge=0)]16 tags: Annotated[list[str], Field(max_length=10)] = []1718# FastAPI query parameters19from fastapi import Query2021@app.get("/items/")22async def get_items(23 q: Annotated[str | None, Query(min_length=3)] = None,24 skip: Annotated[int, Query(ge=0)] = 0,25 limit: Annotated[int, Query(ge=1, le=100)] = 10,26):27 return {"q": q, "skip": skip, "limit": limit}2829# Field with default_factory30class Config(BaseModel):31 items: Annotated[list[str], Field(default_factory=list)]32 metadata: Annotated[dict, Field(default_factory=dict)]3334# With alias35class APIResponse(BaseModel):36 user_name: Annotated[str, Field(alias="userName")]37 created_at: Annotated[str, Field(alias="createdAt")]
Field options:
default: default value.default_factory: callable for mutable defaults.alias: field name in serialized data.description: field description.examples: example values.