@@ -338,13 +338,18 @@ def extract_meta(serializer, resource):
338338 return data
339339
340340 @staticmethod
341- def extract_root_meta (serializer , resource , meta ):
341+ def extract_root_meta (serializer , resource ):
342+ many = False
343+ if hasattr (serializer , 'child' ):
344+ many = True
345+ serializer = serializer .child
346+
347+ data = {}
342348 if getattr (serializer , 'get_root_meta' , None ):
343- root_meta = serializer .get_root_meta (resource )
344- if root_meta :
345- assert isinstance (root_meta , dict ), 'get_root_meta must return a dict'
346- meta .update (root_meta )
347- return meta
349+ json_api_meta = serializer .get_root_meta (resource , many )
350+ assert isinstance (json_api_meta , dict ), 'get_root_meta must return a dict'
351+ data .update (json_api_meta )
352+ return data
348353
349354 @staticmethod
350355 def build_json_resource_obj (fields , resource , resource_instance , resource_name ):
@@ -412,6 +417,7 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
412417 else :
413418 included_resources = list ()
414419
420+ json_api_data = data
415421 json_api_included = list ()
416422 # initialize json_api_meta with pagination meta or an empty dict
417423 json_api_meta = data .get ('meta' , {}) if isinstance (data , dict ) else {}
@@ -421,51 +427,44 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
421427 else :
422428 serializer_data = data
423429
424- if hasattr (serializer_data , 'serializer' ) and getattr (serializer_data .serializer , 'many' , False ):
425- # The below is not true for non-paginated responses
426- # and isinstance(data, dict):
427-
428- # If detail view then json api spec expects dict, otherwise a list
429- # - http://jsonapi.org/format/#document-top-level
430- # The `results` key may be missing if unpaginated or an OPTIONS request
430+ serializer = getattr (serializer_data , 'serializer' , None )
431431
432- resource_serializer = serializer_data . serializer
432+ if serializer is not None :
433433
434434 # Get the serializer fields
435- fields = utils .get_serializer_fields (resource_serializer )
435+ fields = utils .get_serializer_fields (serializer )
436436
437- json_api_data = list ()
438- for position in range (len (serializer_data )):
439- resource = serializer_data [position ] # Get current resource
440- resource_instance = resource_serializer .instance [position ] # Get current instance
437+ # Extract root meta for any type of serializer
438+ json_api_meta .update (self .extract_root_meta (serializer , serializer_data ))
441439
442- json_resource_obj = self .build_json_resource_obj (fields , resource , resource_instance , resource_name )
443- meta = self .extract_meta (resource_serializer , resource )
444- if meta :
445- json_resource_obj .update ({'meta' : utils .format_keys (meta )})
446- json_api_meta = self .extract_root_meta (resource_serializer , resource , json_api_meta )
447- json_api_data .append (json_resource_obj )
440+ if getattr (serializer , 'many' , False ):
441+ json_api_data = list ()
448442
449- included = self .extract_included (fields , resource , resource_instance , included_resources )
450- if included :
451- json_api_included .extend (included )
452- else :
453- # Check if data contains a serializer
454- if hasattr (data , 'serializer' ):
455- fields = utils .get_serializer_fields (data .serializer )
456- resource_instance = data .serializer .instance
457- json_api_data = self .build_json_resource_obj (fields , data , resource_instance , resource_name )
443+ for position in range (len (serializer_data )):
444+ resource = serializer_data [position ] # Get current resource
445+ resource_instance = serializer .instance [position ] # Get current instance
446+
447+ json_resource_obj = self .build_json_resource_obj (fields , resource , resource_instance , resource_name )
448+ meta = self .extract_meta (serializer , resource )
449+ if meta :
450+ json_resource_obj .update ({'meta' : utils .format_keys (meta )})
451+ json_api_data .append (json_resource_obj )
452+
453+ included = self .extract_included (fields , resource , resource_instance , included_resources )
454+ if included :
455+ json_api_included .extend (included )
456+ else :
457+ resource_instance = serializer .instance
458+ json_api_data = self .build_json_resource_obj (fields , serializer_data , resource_instance , resource_name )
458459
459- meta = self .extract_meta (data . serializer , data )
460+ meta = self .extract_meta (serializer , serializer_data )
460461 if meta :
461462 json_api_data .update ({'meta' : utils .format_keys (meta )})
462- json_api_meta = self .extract_root_meta (data .serializer , data , json_api_meta )
463463
464- included = self .extract_included (fields , data , resource_instance , included_resources )
464+ included = self .extract_included (fields , serializer_data , resource_instance , included_resources )
465465 if included :
466466 json_api_included .extend (included )
467- else :
468- json_api_data = data
467+
469468
470469 # Make sure we render data in a specific order
471470 render_data = OrderedDict ()
0 commit comments