custom_encoder: dict = {},
) -> Any:
if isinstance(obj, BaseModel):
- if not obj.Config.json_encoders:
- return jsonable_encoder(
- obj.dict(include=include, exclude=exclude, by_alias=by_alias),
- include_none=include_none,
- )
- else:
- return jsonable_encoder(
- obj.dict(include=include, exclude=exclude, by_alias=by_alias),
- include_none=include_none,
- custom_encoder=obj.Config.json_encoders,
- )
+ 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,
+ )
if isinstance(obj, Enum):
return obj.value
if isinstance(obj, (str, int, float, type(None))):
-import json
from datetime import datetime, timezone
from fastapi import FastAPI
app = FastAPI()
-model = ModelWithDatetimeField(dt_field=datetime.utcnow())
+model = ModelWithDatetimeField(dt_field=datetime(2019, 1, 1, 8))
@app.get("/model", response_model=ModelWithDatetimeField)
def test_dt():
with client:
response = client.get("/model")
- assert json.loads(model.json()) == response.json()
+ assert response.json() == {"dt_field": "2019-01-01T08:00:00+00:00"}
+from datetime import datetime, timezone
+from enum import Enum
+
import pytest
from fastapi.encoders import jsonable_encoder
+from pydantic import BaseModel
class Person:
raise NotImplementedError()
+class ModelWithCustomEncoder(BaseModel):
+ dt_field: datetime
+
+ class Config:
+ json_encoders = {
+ datetime: lambda dt: dt.replace(
+ microsecond=0, tzinfo=timezone.utc
+ ).isoformat()
+ }
+
+
+class RoleEnum(Enum):
+ admin = "admin"
+ normal = "normal"
+
+
+class ModelWithConfig(BaseModel):
+ role: RoleEnum = None
+
+ class Config:
+ use_enum_values = True
+
+
def test_encode_class():
person = Person(name="Foo")
pet = Pet(owner=person, name="Firulais")
unserializable = Unserializable()
with pytest.raises(ValueError):
jsonable_encoder(unserializable)
+
+
+def test_encode_custom_json_encoders_model():
+ model = ModelWithCustomEncoder(dt_field=datetime(2019, 1, 1, 8))
+ assert jsonable_encoder(model) == {"dt_field": "2019-01-01T08:00:00+00:00"}
+
+
+def test_encode_model_with_config():
+ model = ModelWithConfig(role=RoleEnum.admin)
+ assert jsonable_encoder(model) == {"role": "admin"}