]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
:bug: Fix the usage of custom_encoder for jsonable_encoder #714 (#715)
authorStéphane Wirtel <stephane@wirtel.be>
Wed, 27 Nov 2019 20:23:23 +0000 (21:23 +0100)
committerSebastián Ramírez <tiangolo@gmail.com>
Wed, 27 Nov 2019 20:23:23 +0000 (21:23 +0100)
fastapi/encoders.py
tests/test_jsonable_encoder.py

index bececedae8f44c65163650adfb4f32744b4b18f7..25cd0b0269ad4827d3c2fb10861943f22d9ab885 100644 (file)
@@ -32,7 +32,9 @@ def jsonable_encoder(
     if exclude is not None and not isinstance(exclude, set):
         exclude = set(exclude)
     if isinstance(obj, BaseModel):
-        encoder = getattr(obj.Config, "json_encoders", custom_encoder)
+        encoder = getattr(obj.Config, "json_encoders", {})
+        if custom_encoder:
+            encoder.update(custom_encoder)
         if PYDANTIC_1:
             obj_dict = obj.dict(
                 include=include,
index 0975430d78e31a35dcb4affd5fdc14371424fcb8..97fbf6e6de7178d51dc528ea6af2f833400f236c 100644 (file)
@@ -105,3 +105,18 @@ 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_custom_encoders():
+    class safe_datetime(datetime):
+        pass
+
+    class MyModel(BaseModel):
+        dt_field: safe_datetime
+
+    instance = MyModel(dt_field=safe_datetime.now())
+
+    encoded_instance = jsonable_encoder(
+        instance, custom_encoder={safe_datetime: lambda o: o.isoformat()}
+    )
+    assert encoded_instance["dt_field"] == instance.dt_field.isoformat()