Skip to content

Commit 19d3e8d

Browse files
committed
Refactored JSON API Renderer
1 parent f33ca29 commit 19d3e8d

File tree

2 files changed

+47
-343
lines changed

2 files changed

+47
-343
lines changed

rest_framework_json_api/renderers.py

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
"""
22
Renderers
33
"""
4+
from collections import OrderedDict
45
from rest_framework import renderers
56

67
from . import utils
8+
from rest_framework.relations import RelatedField
9+
from rest_framework.settings import api_settings
710

811

912
class JSONRenderer(renderers.JSONRenderer):
@@ -53,15 +56,26 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
5356
# Check for paginated results
5457
results = (data["results"] if isinstance(data, dict) else data)
5558

59+
resource_serializer = results.serializer
60+
61+
# Get the serializer fields
62+
if hasattr(resource_serializer, 'child'):
63+
fields = getattr(resource_serializer.child, 'fields')
64+
else:
65+
fields = getattr(resource_serializer, 'fields')
66+
5667
json_api_data = []
57-
for result in results:
58-
result_id = result.pop('id', None)
59-
json_api_data.append({
60-
'type': resource_name,
61-
'id': result_id,
62-
'attributes': utils.format_keys(result),
63-
'meta': utils.convert_resource(result, results, request)
64-
})
68+
for resource in results:
69+
resource_data = [
70+
('type', resource_name),
71+
('id', utils.extract_id(fields, resource)),
72+
('attributes', utils.format_keys(utils.extract_attributes(fields, resource)))
73+
]
74+
# Add 'self' link if field is present and valid
75+
if api_settings.URL_FIELD_NAME in resource and \
76+
isinstance(fields[api_settings.URL_FIELD_NAME], RelatedField):
77+
resource_data.append(('links', {'self': resource[api_settings.URL_FIELD_NAME]}))
78+
json_api_data.append(OrderedDict(resource_data))
6579
else:
6680
result_id = data.pop('id', None)
6781
json_api_data = {

0 commit comments

Comments
 (0)