From 0dfde6e284b221bf6695a98762a56d13a995e807 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 29 Aug 2020 14:21:00 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20issues=20introduced=20by?= =?UTF-8?q?=20removing=20sqlalchemy=20safeguard=20in=20jsonable=5Fencoder?= =?UTF-8?q?=20(#1987)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi/encoders.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/fastapi/encoders.py b/fastapi/encoders.py index 1c324b915..1255b7497 100644 --- a/fastapi/encoders.py +++ b/fastapi/encoders.py @@ -32,6 +32,7 @@ def jsonable_encoder( exclude_defaults: bool = False, exclude_none: bool = False, custom_encoder: dict = {}, + sqlalchemy_safe: bool = True, ) -> Any: if include is not None and not isinstance(include, set): include = set(include) @@ -56,6 +57,7 @@ def jsonable_encoder( exclude_none=exclude_none, exclude_defaults=exclude_defaults, custom_encoder=encoder, + sqlalchemy_safe=sqlalchemy_safe, ) if isinstance(obj, Enum): return obj.value @@ -66,8 +68,14 @@ def jsonable_encoder( if isinstance(obj, dict): encoded_dict = {} for key, value in obj.items(): - if (value is not None or not exclude_none) and ( - (include and key in include) or not exclude or key not in exclude + if ( + ( + not sqlalchemy_safe + or (not isinstance(key, str)) + or (not key.startswith("_sa")) + ) + and (value is not None or not exclude_none) + and ((include and key in include) or not exclude or key not in exclude) ): encoded_key = jsonable_encoder( key, @@ -75,6 +83,7 @@ def jsonable_encoder( exclude_unset=exclude_unset, exclude_none=exclude_none, custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, ) encoded_value = jsonable_encoder( value, @@ -82,6 +91,7 @@ def jsonable_encoder( exclude_unset=exclude_unset, exclude_none=exclude_none, custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, ) encoded_dict[encoded_key] = encoded_value return encoded_dict @@ -98,6 +108,7 @@ def jsonable_encoder( exclude_defaults=exclude_defaults, exclude_none=exclude_none, custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, ) ) return encoded_list @@ -133,4 +144,5 @@ def jsonable_encoder( exclude_defaults=exclude_defaults, exclude_none=exclude_none, custom_encoder=custom_encoder, + sqlalchemy_safe=sqlalchemy_safe, )