@@ -319,6 +319,20 @@ def extract_included(fields, resource, resource_instance, included_resources):
319319
320320 return utils .format_keys (included_data )
321321
322+ @staticmethod
323+ def extract_meta (serializer , resource ):
324+ if hasattr (serializer , 'child' ):
325+ meta = getattr (serializer .child , 'Meta' , None )
326+ else :
327+ meta = getattr (serializer , 'Meta' , None )
328+ meta_fields = getattr (meta , 'meta_fields' , {})
329+ data = OrderedDict ()
330+ for field_name in meta_fields :
331+ data .update ({
332+ field_name : resource .get (field_name )
333+ })
334+ return data
335+
322336 @staticmethod
323337 def build_json_resource_obj (fields , resource , resource_instance , resource_name ):
324338 resource_data = [
@@ -409,8 +423,13 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
409423 for position in range (len (serializer_data )):
410424 resource = serializer_data [position ] # Get current resource
411425 resource_instance = resource_serializer .instance [position ] # Get current instance
412- json_api_data .append (
413- self .build_json_resource_obj (fields , resource , resource_instance , resource_name ))
426+
427+ json_resource_obj = self .build_json_resource_obj (fields , resource , resource_instance , resource_name )
428+ meta = self .extract_meta (resource_serializer , resource )
429+ if meta :
430+ json_resource_obj .update ({'meta' : utils .format_keys (meta )})
431+ json_api_data .append (json_resource_obj )
432+
414433 included = self .extract_included (fields , resource , resource_instance , included_resources )
415434 if included :
416435 json_api_included .extend (included )
@@ -420,6 +439,11 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
420439 fields = utils .get_serializer_fields (data .serializer )
421440 resource_instance = data .serializer .instance
422441 json_api_data = self .build_json_resource_obj (fields , data , resource_instance , resource_name )
442+
443+ meta = self .extract_meta (data .serializer , data )
444+ if meta :
445+ json_api_data .update ({'meta' : utils .format_keys (meta )})
446+
423447 included = self .extract_included (fields , data , resource_instance , included_resources )
424448 if included :
425449 json_api_included .extend (included )
@@ -453,7 +477,8 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
453477 render_data ['included' ] = sorted (unique_compound_documents , key = lambda item : (item ['type' ], item ['id' ]))
454478
455479 if isinstance (data , dict ) and data .get ('meta' ):
456- render_data ['meta' ] = data .get ('meta' )
480+ # add top level meta (such as pagination data)
481+ render_data .update ({'meta' : utils .format_keys (data .get ('meta' ))})
457482
458483 return super (JSONRenderer , self ).render (
459484 render_data , accepted_media_type , renderer_context
0 commit comments