From 7fedc03f64c4fc08622b1fab3f42704d80d6ef65 Mon Sep 17 00:00:00 2001 From: letmetry-oss Date: Mon, 16 Mar 2026 13:56:36 +0530 Subject: [PATCH] Fix custom encoders for BaseModel python-mode dump --- fastapi/encoders.py | 3 ++- tests/test_jsonable_encoder.py | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/fastapi/encoders.py b/fastapi/encoders.py index 84893dc808..c000c390e1 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -225,7 +225,7 @@ def jsonable_encoder( exclude = set(exclude) # type: ignore[assignment] # ty: ignore[unused-ignore-comment] if isinstance(obj, BaseModel): obj_dict = obj.model_dump( - mode="json", + mode="python", include=include, exclude=exclude, by_alias=by_alias, @@ -237,6 +237,7 @@ def jsonable_encoder( obj_dict, exclude_none=exclude_none, exclude_defaults=exclude_defaults, + custom_encoder=custom_encoder, sqlalchemy_safe=sqlalchemy_safe, ) if dataclasses.is_dataclass(obj): diff --git a/tests/test_jsonable_encoder.py b/tests/test_jsonable_encoder.py index 595202beaf..d4fbf2214e 100644 --- a/tests/test_jsonable_encoder.py +++ b/tests/test_jsonable_encoder.py @@ -225,6 +225,19 @@ def test_custom_encoders(): assert encoded_instance2["dt_field"] == instance["dt_field"].isoformat() + +def test_custom_encoders_applied_to_model_dump_python_values(): + class ModelWithDecimal(BaseModel): + value: Decimal + + instance = ModelWithDecimal(value=Decimal("1.23")) + + encoded_instance = jsonable_encoder( + instance, custom_encoder={Decimal: lambda o: f"{o} custom"} + ) + assert encoded_instance == {"value": "1.23 custom"} + + def test_custom_enum_encoders(): def custom_enum_encoder(v: Enum): return v.value.lower()