Skip to content

Commit 0efc088

Browse files
committed
Optimization fixes
1 parent 2f49d37 commit 0efc088

File tree

2 files changed

+10
-19
lines changed

2 files changed

+10
-19
lines changed

rest_framework_json_api/renderers.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,20 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
6969
fields = utils.get_serializer_fields(resource_serializer)
7070

7171
json_api_data = list()
72-
for resource in results:
72+
for position in range(len(results)):
73+
resource = results[position] # Get current resource
74+
resource_instance = resource_serializer.instance[position] # Get current instance
7375
json_api_data.append(
74-
utils.build_json_resource_obj(fields, resource, resource_name))
76+
utils.build_json_resource_obj(fields, resource, resource_instance, resource_name))
7577
included = utils.extract_included(fields, resource)
7678
if included:
7779
json_api_included.extend(included)
7880
else:
7981
# Check if data contains a serializer
8082
if hasattr(data, 'serializer'):
8183
fields = utils.get_serializer_fields(data.serializer)
82-
json_api_data = utils.build_json_resource_obj(fields, data, resource_name)
84+
resource_instance = data.serializer.instance
85+
json_api_data = utils.build_json_resource_obj(fields, data, resource_instance, resource_name)
8386
included = utils.extract_included(fields, data)
8487
if included:
8588
json_api_included.extend(included)

rest_framework_json_api/utils.py

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -128,13 +128,13 @@ def format_value(value, format_type=None):
128128
return value
129129

130130

131-
def build_json_resource_obj(fields, resource, resource_name):
131+
def build_json_resource_obj(fields, resource, resource_instance, resource_name):
132132
resource_data = [
133133
('type', resource_name),
134134
('id', extract_id(fields, resource)),
135135
('attributes', extract_attributes(fields, resource)),
136136
]
137-
relationships = extract_relationships(fields, resource)
137+
relationships = extract_relationships(fields, resource, resource_instance)
138138
if relationships:
139139
resource_data.append(('relationships', relationships))
140140
# Add 'self' link if field is present and valid
@@ -166,18 +166,6 @@ def get_related_resource_type(relation):
166166
return inflection.pluralize(relation_model.__name__).lower()
167167

168168

169-
def get_current_instance(fields, resource):
170-
serializer_instance = fields.serializer.instance
171-
if isinstance(serializer_instance, list):
172-
current_id = extract_id(fields, resource)
173-
for instance in serializer_instance:
174-
# Search for our own instance
175-
if encoding.force_text(instance.pk) == current_id:
176-
return instance
177-
else:
178-
return serializer_instance
179-
180-
181169
def extract_id_from_url(url):
182170
http_prefix = url.startswith(('http:', 'https:'))
183171
if http_prefix:
@@ -215,7 +203,7 @@ def extract_attributes(fields, resource):
215203
return format_keys(data)
216204

217205

218-
def extract_relationships(fields, resource):
206+
def extract_relationships(fields, resource, resource_instance):
219207
data = OrderedDict()
220208
for field_name, field in six.iteritems(fields):
221209
# Skip URL field
@@ -230,7 +218,7 @@ def extract_relationships(fields, resource):
230218
# special case for HyperlinkedRouterField
231219
relation_data = list()
232220
relation_type = get_related_resource_type(field)
233-
related = getattr(get_current_instance(fields, resource), field_name).all()
221+
related = getattr(resource_instance, field_name).all()
234222
for relation in related:
235223
relation_data.append(OrderedDict([('type', relation_type), ('id', relation.pk)]))
236224

0 commit comments

Comments
 (0)