Thanks to visit codestin.com
Credit goes to github.com

Skip to content
8 changes: 7 additions & 1 deletion fastapi/encoders.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,23 @@ def jsonable_encoder(
include_none: bool = True,
custom_encoder: dict = {},
sqlalchemy_safe: bool = True,
use_enum_values: bool = False,
) -> Any:
if isinstance(obj, BaseModel):
use_enum_values = getattr(obj.Config, "use_enum_values", use_enum_values)
encoder = getattr(obj.Config, "json_encoders", custom_encoder)
return jsonable_encoder(
obj.dict(include=include, exclude=exclude, by_alias=by_alias),
include_none=include_none,
custom_encoder=encoder,
sqlalchemy_safe=sqlalchemy_safe,
use_enum_values=use_enum_values,
)
if isinstance(obj, Enum):
return obj.value
if use_enum_values:
return obj.value
else:
return obj.name
if isinstance(obj, (str, int, float, type(None))):
return obj
if isinstance(obj, dict):
Expand Down
17 changes: 13 additions & 4 deletions tests/test_jsonable_encoder.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ class Config:


class RoleEnum(Enum):
admin = "admin"
normal = "normal"
adminkey = "adminvalue"
normalkey = "normalvalue"


class ModelWithConfig(BaseModel):
Expand All @@ -59,6 +59,10 @@ class Config:
use_enum_values = True


class ModelWithoutConfig(BaseModel):
role: RoleEnum = None


class ModelWithAlias(BaseModel):
foo: str = Schema(..., alias="Foo")

Expand Down Expand Up @@ -87,8 +91,8 @@ def test_encode_custom_json_encoders_model():


def test_encode_model_with_config():
model = ModelWithConfig(role=RoleEnum.admin)
assert jsonable_encoder(model) == {"role": "admin"}
model = ModelWithConfig(role=RoleEnum.adminkey)
assert jsonable_encoder(model) == {"role": "adminvalue"}


def test_encode_model_with_alias_raises():
Expand All @@ -99,3 +103,8 @@ def test_encode_model_with_alias_raises():
def test_encode_model_with_alias():
model = ModelWithAlias(Foo="Bar")
assert jsonable_encoder(model) == {"Foo": "Bar"}


def test_encode_model_without_config():
model = ModelWithoutConfig(role=RoleEnum.adminkey)
assert jsonable_encoder(model) == {"role": "adminkey"}