Browse Source

Apply custom encoders to model fields

pull/15654/head
jiyujie2006 5 days ago
parent
commit
5d0b3263ca
  1. 3
      fastapi/encoders.py
  2. 17
      tests/test_jsonable_encoder.py

3
fastapi/encoders.py

@ -242,7 +242,7 @@ def jsonable_encoder(
exclude = set(exclude) # type: ignore[assignment] # ty: ignore[invalid-assignment] exclude = set(exclude) # type: ignore[assignment] # ty: ignore[invalid-assignment]
if isinstance(obj, BaseModel): if isinstance(obj, BaseModel):
obj_dict = obj.model_dump( obj_dict = obj.model_dump(
mode="json", mode="python" if custom_encoder else "json",
include=include, include=include,
exclude=exclude, exclude=exclude,
by_alias=by_alias, by_alias=by_alias,
@ -254,6 +254,7 @@ def jsonable_encoder(
obj_dict, obj_dict,
exclude_none=exclude_none, exclude_none=exclude_none,
exclude_defaults=exclude_defaults, exclude_defaults=exclude_defaults,
custom_encoder=custom_encoder,
sqlalchemy_safe=sqlalchemy_safe, sqlalchemy_safe=sqlalchemy_safe,
) )
if dataclasses.is_dataclass(obj): if dataclasses.is_dataclass(obj):

17
tests/test_jsonable_encoder.py

@ -12,7 +12,7 @@ import pytest
from fastapi._compat import Undefined from fastapi._compat import Undefined
from fastapi.encoders import jsonable_encoder from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import PydanticV1NotSupportedError from fastapi.exceptions import PydanticV1NotSupportedError
from pydantic import BaseModel, Field, ValidationError from pydantic import BaseModel, ConfigDict, Field, ValidationError
class Person: class Person:
@ -225,6 +225,21 @@ def test_custom_encoders():
assert encoded_instance2["dt_field"] == instance["dt_field"].isoformat() assert encoded_instance2["dt_field"] == instance["dt_field"].isoformat()
def test_custom_encoder_model_field():
class CustomValue:
pass
class ModelWithCustomValue(BaseModel):
model_config = ConfigDict(arbitrary_types_allowed=True)
value: CustomValue
assert jsonable_encoder(
ModelWithCustomValue(value=CustomValue()),
custom_encoder={CustomValue: lambda _: "encoded"},
) == {"value": "encoded"}
def test_custom_enum_encoders(): def test_custom_enum_encoders():
def custom_enum_encoder(v: Enum): def custom_enum_encoder(v: Enum):
return v.value.lower() return v.value.lower()

Loading…
Cancel
Save