]> git.ipfire.org Git - thirdparty/fastapi/fastapi.git/commitdiff
:lock: Ensure `skip_defaults` doesn't cause extra fields to be serialized (#485)
authordmontagu <35119617+dmontagu@users.noreply.github.com>
Fri, 30 Aug 2019 23:56:14 +0000 (16:56 -0700)
committerSebastián Ramírez <tiangolo@gmail.com>
Fri, 30 Aug 2019 23:56:14 +0000 (18:56 -0500)
fastapi/routing.py
tests/test_skip_defaults.py

index 930cbe001ff1d4e6db92fbc187455ad80a12b57e..08f43bf524a8d211c4fe87922b288f53340aa029 100644 (file)
@@ -45,6 +45,8 @@ def serialize_response(
 ) -> Any:
     if field:
         errors = []
+        if skip_defaults and isinstance(response, BaseModel):
+            response = response.dict(skip_defaults=skip_defaults)
         value, errors_ = field.validate(response, {}, loc=("response",))
         if isinstance(errors_, ErrorWrapper):
             errors.append(errors_)
@@ -52,8 +54,6 @@ def serialize_response(
             errors.extend(errors_)
         if errors:
             raise ValidationError(errors)
-        if skip_defaults and isinstance(response, BaseModel):
-            value = response.dict(skip_defaults=skip_defaults)
         return jsonable_encoder(
             value,
             include=include,
index 8579b50ea560a678369283a76d63699f6153dc8e..9997ba7b2c4b107a916e415b1008f7517c944b38 100644 (file)
@@ -16,9 +16,13 @@ class Model(BaseModel):
     sub: SubModel
 
 
+class ModelSubclass(Model):
+    y: int
+
+
 @app.get("/", response_model=Model, response_model_skip_defaults=True)
-def get() -> Model:
-    return Model(sub={})
+def get() -> ModelSubclass:
+    return ModelSubclass(sub={}, y=1)
 
 
 client = TestClient(app)