From 945d0ded0ea06d629009a9e5395ea449bbb91c73 Mon Sep 17 00:00:00 2001 From: E-Kalla Date: Fri, 23 Jul 2021 13:28:56 +0200 Subject: [PATCH 1/2] fix discriminator not marshalled correctly when using polymorph fields --- flask_restx/fields.py | 5 ++++- tests/test_fields.py | 9 +++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/flask_restx/fields.py b/flask_restx/fields.py index 00764d01..2810e4f6 100644 --- a/flask_restx/fields.py +++ b/flask_restx/fields.py @@ -762,8 +762,11 @@ def output(self, key, obj, ordered=False, **kwargs): "Unable to determine a candidate for: " + value.__class__.__name__ ) else: + solved = candidates[0].resolved + # Clear cache + del candidates[0].resolved return marshal( - value, candidates[0].resolved, mask=self.mask, ordered=ordered + value, solved, mask=self.mask, ordered=ordered ) def resolve_ancestor(self, models): diff --git a/tests/test_fields.py b/tests/test_fields.py index 09b7e271..2633b7fc 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1336,6 +1336,15 @@ def data(cls): "owner": {"name": "child2", "model": "Child2", "extra2": "extra2"} } + assert data(Child1) == { + "owner": {"name": "child1", "model": "Child1", "extra1": "extra1"} + } + + assert data(Child2) == { + "owner": {"name": "child2", "model": "Child2", "extra2": "extra2"} + } + + class CustomFieldTest(FieldTestCase): def test_custom_field(self): From c96a242b59d1b2bd97696c818142a4abe099d347 Mon Sep 17 00:00:00 2001 From: E-Kalla Date: Fri, 27 Aug 2021 14:36:26 +0200 Subject: [PATCH 2/2] replacing cached_property by property --- flask_restx/fields.py | 5 +---- flask_restx/model.py | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/flask_restx/fields.py b/flask_restx/fields.py index 2810e4f6..00764d01 100644 --- a/flask_restx/fields.py +++ b/flask_restx/fields.py @@ -762,11 +762,8 @@ def output(self, key, obj, ordered=False, **kwargs): "Unable to determine a candidate for: " + value.__class__.__name__ ) else: - solved = candidates[0].resolved - # Clear cache - del candidates[0].resolved return marshal( - value, solved, mask=self.mask, ordered=ordered + value, candidates[0].resolved, mask=self.mask, ordered=ordered ) def resolve_ancestor(self, models): diff --git a/flask_restx/model.py b/flask_restx/model.py index 1b2f7b7d..1706988d 100644 --- a/flask_restx/model.py +++ b/flask_restx/model.py @@ -175,7 +175,7 @@ def _schema(self): return not_none(definition) - @cached_property + @property def resolved(self): """ Resolve real fields before submitting them to marshal