From 6c6bdb62337ab2e05438d99fce66113e375ddb04 Mon Sep 17 00:00:00 2001 From: dmontagu <35119617+dmontagu@users.noreply.github.com> Date: Fri, 30 Aug 2019 16:56:14 -0700 Subject: [PATCH] :lock: Ensure `skip_defaults` doesn't cause extra fields to be serialized (#485) --- fastapi/routing.py | 4 ++-- tests/test_skip_defaults.py | 8 ++++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/fastapi/routing.py b/fastapi/routing.py index 930cbe001..08f43bf52 100644 --- a/fastapi/routing.py +++ b/fastapi/routing.py @@ -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, diff --git a/tests/test_skip_defaults.py b/tests/test_skip_defaults.py index 8579b50ea..9997ba7b2 100644 --- a/tests/test_skip_defaults.py +++ b/tests/test_skip_defaults.py @@ -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)