22Utils.
33"""
44import inflection
5-
65from django .core import urlresolvers
76from django .conf import settings
87from django .utils import six , encoding
9- from django .utils .six .moves .urllib .parse import urlparse , urlunparse
108from django .utils .translation import ugettext_lazy as _
11-
129from rest_framework .serializers import BaseSerializer , ListSerializer , ModelSerializer
1310from rest_framework .relations import RelatedField , HyperlinkedRelatedField , PrimaryKeyRelatedField
1411from rest_framework .settings import api_settings
1512from rest_framework .exceptions import APIException
1613
14+ from django .utils .six .moves .urllib .parse import urlparse
15+
1716try :
1817 from rest_framework .compat import OrderedDict
1918except ImportError :
@@ -178,9 +177,9 @@ def extract_id_from_url(url):
178177def extract_id (fields , resource ):
179178 for field_name , field in six .iteritems (fields ):
180179 if field_name == 'id' :
181- return encoding .force_text (resource [ field_name ] )
180+ return encoding .force_text (resource . get ( field_name ) )
182181 if field_name == api_settings .URL_FIELD_NAME :
183- return extract_id_from_url (resource [ field_name ] )
182+ return extract_id_from_url (resource . get ( field_name ) )
184183
185184
186185def extract_attributes (fields , resource ):
@@ -193,7 +192,7 @@ def extract_attributes(fields, resource):
193192 if isinstance (field , (RelatedField , BaseSerializer , ManyRelatedField )):
194193 continue
195194 data .update ({
196- field_name : resource [ field_name ]
195+ field_name : resource . get ( field_name )
197196 })
198197
199198 return format_keys (data )
@@ -213,11 +212,11 @@ def extract_relationships(fields, resource):
213212 if isinstance (field , (PrimaryKeyRelatedField , HyperlinkedRelatedField )):
214213 relation_type = get_related_resource_type (field )
215214
216- if resource [ field_name ] is not None :
215+ if resource . get ( field_name ) is not None :
217216 if isinstance (field , PrimaryKeyRelatedField ):
218- relation_id = encoding .force_text (resource [ field_name ] )
217+ relation_id = encoding .force_text (resource . get ( field_name ) )
219218 elif isinstance (field , HyperlinkedRelatedField ):
220- relation_id = extract_id_from_url (resource [ field_name ] )
219+ relation_id = extract_id_from_url (resource . get ( field_name ) )
221220 else :
222221 relation_id = None
223222
@@ -240,14 +239,14 @@ def extract_relationships(fields, resource):
240239 relation_type = get_related_resource_type (relation )
241240
242241 if isinstance (relation , HyperlinkedRelatedField ):
243- for link in resource [ field_name ] :
242+ for link in resource . get ( field_name , list ()) :
244243 relation_data .append (OrderedDict ([('type' , relation_type ), ('id' , extract_id_from_url (link ))]))
245244
246245 data .update ({field_name : {'data' : relation_data }})
247246 continue
248247
249248 if isinstance (relation , PrimaryKeyRelatedField ):
250- for pk in resource [ field_name ] :
249+ for pk in resource . get ( field_name , list ()) :
251250 relation_data .append (OrderedDict ([('type' , relation_type ), ('id' , encoding .force_text (pk ))]))
252251
253252 data .update ({field_name : {'data' : relation_data }})
@@ -262,7 +261,7 @@ def extract_relationships(fields, resource):
262261
263262 # Get the serializer fields
264263 serializer_fields = get_serializer_fields (serializer )
265- serializer_data = resource [ field_name ]
264+ serializer_data = resource . get ( field_name )
266265 if isinstance (serializer_data , list ):
267266 for serializer_resource in serializer_data :
268267 relation_data .append (
@@ -279,14 +278,14 @@ def extract_relationships(fields, resource):
279278
280279 # Get the serializer fields
281280 serializer_fields = get_serializer_fields (field )
282- serializer_data = resource [ field_name ]
281+ serializer_data = resource . get ( field_name )
283282 data .update ({
284283 field_name : {
285284 'data' : (
286285 OrderedDict ([
287286 ('type' , relation_type ),
288287 ('id' , extract_id (serializer_fields , serializer_data ))
289- ]) if resource [ field_name ] else None )
288+ ]) if resource . get ( field_name ) else None )
290289 }
291290 })
292291 continue
@@ -313,7 +312,7 @@ def extract_included(fields, resource):
313312
314313 # Get the serializer fields
315314 serializer_fields = get_serializer_fields (serializer )
316- serializer_data = resource [ field_name ]
315+ serializer_data = resource . get ( field_name )
317316 if isinstance (serializer_data , list ):
318317 for serializer_resource in serializer_data :
319318 included_data .append (build_json_resource_obj (serializer_fields , serializer_resource , relation_type ))
@@ -325,7 +324,7 @@ def extract_included(fields, resource):
325324
326325 # Get the serializer fields
327326 serializer_fields = get_serializer_fields (field )
328- serializer_data = resource [ field_name ]
327+ serializer_data = resource . get ( field_name )
329328 if serializer_data :
330329 included_data .append (build_json_resource_obj (serializer_fields , serializer_data , relation_type ))
331330
0 commit comments