diff --git a/benchmark_encoder.py b/benchmark_encoder.py index c46ea3f1a..c50e75fa8 100644 --- a/benchmark_encoder.py +++ b/benchmark_encoder.py @@ -1,7 +1,7 @@ import time -from typing import List, Optional -from pydantic import BaseModel + from fastapi.encoders import jsonable_encoder +from pydantic import BaseModel class SubModel(BaseModel): @@ -13,8 +13,8 @@ class MainModel(BaseModel): id: int title: str sub: SubModel - items: List[SubModel] - maybe: Optional[str] = None + items: list[SubModel] + maybe: str | None = None def run_benchmark(): diff --git a/fastapi/encoders.py b/fastapi/encoders.py index 06de643d4..fab66b6d6 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -254,7 +254,8 @@ def jsonable_encoder( if not sqlalchemy_safe: return obj_dict return { - k: v for k, v in obj_dict.items() + k: v + for k, v in obj_dict.items() if not (isinstance(k, str) and k.startswith("_sa")) } # Fallback to recursive call for recursive exclude_none/exclude_defaults cleanup