From cfc1c75248b3a3be5ddf6464f56d815c1b92c85f Mon Sep 17 00:00:00 2001 From: Roberto Barreda Date: Thu, 14 Sep 2017 11:46:52 +0200 Subject: [PATCH 1/6] support polymorphic list Render polymorphic list of items with different fields --- rest_framework_json_api/renderers.py | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/rest_framework_json_api/renderers.py b/rest_framework_json_api/renderers.py index 427fdd9d..16963acb 100644 --- a/rest_framework_json_api/renderers.py +++ b/rest_framework_json_api/renderers.py @@ -535,12 +535,6 @@ def render(self, data, accepted_media_type=None, renderer_context=None): if serializer is not None: - # Get the serializer fields - fields = utils.get_serializer_fields(serializer) - - # Determine if resource name must be resolved on each instance (polymorphic serializer) - force_type_resolution = getattr(serializer, '_poly_force_type_resolution', False) - # Extract root meta for any type of serializer json_api_meta.update(self.extract_root_meta(serializer, serializer_data)) @@ -550,7 +544,11 @@ def render(self, data, accepted_media_type=None, renderer_context=None): for position in range(len(serializer_data)): resource = serializer_data[position] # Get current resource resource_instance = serializer.instance[position] # Get current instance - + resource_serializer_class = serializer.child.get_polymorphic_serializer_for_instance(resource_instance) + resource_serializer = resource_serializer_class(resource_instance) + fields = utils.get_serializer_fields(resource_serializer) + force_type_resolution = getattr(resource_serializer, '_poly_force_type_resolution', False) + json_resource_obj = self.build_json_resource_obj( fields, resource, resource_instance, resource_name, force_type_resolution ) @@ -566,6 +564,9 @@ def render(self, data, accepted_media_type=None, renderer_context=None): json_api_included.extend(included) else: resource_instance = serializer.instance + fields = utils.get_serializer_fields(serializer) + force_type_resolution = getattr(serializer, '_poly_force_type_resolution', False) + json_api_data = self.build_json_resource_obj( fields, serializer_data, resource_instance, resource_name, force_type_resolution ) From e937ec96e521b36b3569bb629742a4645f034736 Mon Sep 17 00:00:00 2001 From: Roberto Barreda Date: Thu, 14 Sep 2017 11:52:40 +0200 Subject: [PATCH 2/6] pep8 --- rest_framework_json_api/renderers.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rest_framework_json_api/renderers.py b/rest_framework_json_api/renderers.py index 16963acb..4e5f90c8 100644 --- a/rest_framework_json_api/renderers.py +++ b/rest_framework_json_api/renderers.py @@ -544,10 +544,12 @@ def render(self, data, accepted_media_type=None, renderer_context=None): for position in range(len(serializer_data)): resource = serializer_data[position] # Get current resource resource_instance = serializer.instance[position] # Get current instance - resource_serializer_class = serializer.child.get_polymorphic_serializer_for_instance(resource_instance) + resource_serializer_class = serializer.child.\ + get_polymorphic_serializer_for_instance(resource_instance) resource_serializer = resource_serializer_class(resource_instance) fields = utils.get_serializer_fields(resource_serializer) - force_type_resolution = getattr(resource_serializer, '_poly_force_type_resolution', False) + force_type_resolution = getattr(resource_serializer, + '_poly_force_type_resolution', False) json_resource_obj = self.build_json_resource_obj( fields, resource, resource_instance, resource_name, force_type_resolution From 1d35f336b12d4399c39972a86ce925214adac3ed Mon Sep 17 00:00:00 2001 From: Roberto Barreda Date: Wed, 29 Nov 2017 13:36:14 +0100 Subject: [PATCH 3/6] fix polymorphic models serializer fix get_polymorphic_serializer_for_instance only for PolymorphicModelSerializer --- rest_framework_json_api/renderers.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/rest_framework_json_api/renderers.py b/rest_framework_json_api/renderers.py index 4e5f90c8..60c0c1e0 100644 --- a/rest_framework_json_api/renderers.py +++ b/rest_framework_json_api/renderers.py @@ -12,7 +12,7 @@ from rest_framework.settings import api_settings from rest_framework_json_api import utils - +from rest_framework_json_api.serializers import PolymorphicModelSerializer class JSONRenderer(renderers.JSONRenderer): """ @@ -544,13 +544,18 @@ def render(self, data, accepted_media_type=None, renderer_context=None): for position in range(len(serializer_data)): resource = serializer_data[position] # Get current resource resource_instance = serializer.instance[position] # Get current instance - resource_serializer_class = serializer.child.\ - get_polymorphic_serializer_for_instance(resource_instance) - resource_serializer = resource_serializer_class(resource_instance) - fields = utils.get_serializer_fields(resource_serializer) - force_type_resolution = getattr(resource_serializer, - '_poly_force_type_resolution', False) + if isinstance(serializer.child, PolymorphicModelSerializer): + resource_serializer_class = serializer.child.\ + get_polymorphic_serializer_for_instance(resource_instance)() + else: + resource_serializer_class = serializer.child + + fields = utils.get_serializer_fields(resource_serializer_class) + force_type_resolution = getattr( + resource_serializer_class, '_poly_force_type_resolution', + False + json_resource_obj = self.build_json_resource_obj( fields, resource, resource_instance, resource_name, force_type_resolution ) @@ -565,10 +570,10 @@ def render(self, data, accepted_media_type=None, renderer_context=None): if included: json_api_included.extend(included) else: - resource_instance = serializer.instance fields = utils.get_serializer_fields(serializer) force_type_resolution = getattr(serializer, '_poly_force_type_resolution', False) + resource_instance = serializer.instance json_api_data = self.build_json_resource_obj( fields, serializer_data, resource_instance, resource_name, force_type_resolution ) From 8048ff1accc396cdfc1899f5df4bcb6cee064f90 Mon Sep 17 00:00:00 2001 From: Roberto Barreda Date: Wed, 29 Nov 2017 13:41:10 +0100 Subject: [PATCH 4/6] fix typo --- rest_framework_json_api/renderers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rest_framework_json_api/renderers.py b/rest_framework_json_api/renderers.py index 60c0c1e0..fcdbc732 100644 --- a/rest_framework_json_api/renderers.py +++ b/rest_framework_json_api/renderers.py @@ -555,7 +555,8 @@ def render(self, data, accepted_media_type=None, renderer_context=None): force_type_resolution = getattr( resource_serializer_class, '_poly_force_type_resolution', False - + ) + json_resource_obj = self.build_json_resource_obj( fields, resource, resource_instance, resource_name, force_type_resolution ) From 0a1d8b8384aedc64ff817a5f373c2aa3a837981b Mon Sep 17 00:00:00 2001 From: Roberto Barreda Date: Wed, 29 Nov 2017 14:24:49 +0100 Subject: [PATCH 5/6] pep8 --- rest_framework_json_api/renderers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/rest_framework_json_api/renderers.py b/rest_framework_json_api/renderers.py index fcdbc732..1e75981d 100644 --- a/rest_framework_json_api/renderers.py +++ b/rest_framework_json_api/renderers.py @@ -14,6 +14,7 @@ from rest_framework_json_api import utils from rest_framework_json_api.serializers import PolymorphicModelSerializer + class JSONRenderer(renderers.JSONRenderer): """ Render a JSON response per the JSON API spec: From 2a0b377dce4980730457afcbe3c314bfa8ab7ef2 Mon Sep 17 00:00:00 2001 From: Roberto Barreda Date: Fri, 1 Dec 2017 16:09:43 +0100 Subject: [PATCH 6/6] fix circular import and pep8 --- rest_framework_json_api/renderers.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rest_framework_json_api/renderers.py b/rest_framework_json_api/renderers.py index 1e75981d..26362665 100644 --- a/rest_framework_json_api/renderers.py +++ b/rest_framework_json_api/renderers.py @@ -11,8 +11,7 @@ from rest_framework.serializers import BaseSerializer, ListSerializer, Serializer from rest_framework.settings import api_settings -from rest_framework_json_api import utils -from rest_framework_json_api.serializers import PolymorphicModelSerializer +from rest_framework_json_api import serializers, utils class JSONRenderer(renderers.JSONRenderer): @@ -545,8 +544,8 @@ def render(self, data, accepted_media_type=None, renderer_context=None): for position in range(len(serializer_data)): resource = serializer_data[position] # Get current resource resource_instance = serializer.instance[position] # Get current instance - - if isinstance(serializer.child, PolymorphicModelSerializer): + + if isinstance(serializer.child, serializers.PolymorphicModelSerializer): resource_serializer_class = serializer.child.\ get_polymorphic_serializer_for_instance(resource_instance)() else: