2
2
Utils.
3
3
"""
4
4
import inflection
5
-
6
5
from django .core import urlresolvers
7
6
from django .conf import settings
8
7
from django .utils import six , encoding
9
- from django .utils .six .moves .urllib .parse import urlparse , urlunparse
10
8
from django .utils .translation import ugettext_lazy as _
11
-
12
9
from rest_framework .serializers import BaseSerializer , ListSerializer , ModelSerializer
13
10
from rest_framework .relations import RelatedField , HyperlinkedRelatedField , PrimaryKeyRelatedField
14
11
from rest_framework .settings import api_settings
15
12
from rest_framework .exceptions import APIException
16
13
14
+ from django .utils .six .moves .urllib .parse import urlparse
15
+
17
16
try :
18
17
from rest_framework .compat import OrderedDict
19
18
except ImportError :
@@ -178,9 +177,9 @@ def extract_id_from_url(url):
178
177
def extract_id (fields , resource ):
179
178
for field_name , field in six .iteritems (fields ):
180
179
if field_name == 'id' :
181
- return encoding .force_text (resource [ field_name ] )
180
+ return encoding .force_text (resource . get ( field_name ) )
182
181
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 ) )
184
183
185
184
186
185
def extract_attributes (fields , resource ):
@@ -193,7 +192,7 @@ def extract_attributes(fields, resource):
193
192
if isinstance (field , (RelatedField , BaseSerializer , ManyRelatedField )):
194
193
continue
195
194
data .update ({
196
- field_name : resource [ field_name ]
195
+ field_name : resource . get ( field_name )
197
196
})
198
197
199
198
return format_keys (data )
@@ -213,11 +212,11 @@ def extract_relationships(fields, resource):
213
212
if isinstance (field , (PrimaryKeyRelatedField , HyperlinkedRelatedField )):
214
213
relation_type = get_related_resource_type (field )
215
214
216
- if resource [ field_name ] is not None :
215
+ if resource . get ( field_name ) is not None :
217
216
if isinstance (field , PrimaryKeyRelatedField ):
218
- relation_id = encoding .force_text (resource [ field_name ] )
217
+ relation_id = encoding .force_text (resource . get ( field_name ) )
219
218
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 ) )
221
220
else :
222
221
relation_id = None
223
222
@@ -240,14 +239,14 @@ def extract_relationships(fields, resource):
240
239
relation_type = get_related_resource_type (relation )
241
240
242
241
if isinstance (relation , HyperlinkedRelatedField ):
243
- for link in resource [ field_name ] :
242
+ for link in resource . get ( field_name , list ()) :
244
243
relation_data .append (OrderedDict ([('type' , relation_type ), ('id' , extract_id_from_url (link ))]))
245
244
246
245
data .update ({field_name : {'data' : relation_data }})
247
246
continue
248
247
249
248
if isinstance (relation , PrimaryKeyRelatedField ):
250
- for pk in resource [ field_name ] :
249
+ for pk in resource . get ( field_name , list ()) :
251
250
relation_data .append (OrderedDict ([('type' , relation_type ), ('id' , encoding .force_text (pk ))]))
252
251
253
252
data .update ({field_name : {'data' : relation_data }})
@@ -262,7 +261,7 @@ def extract_relationships(fields, resource):
262
261
263
262
# Get the serializer fields
264
263
serializer_fields = get_serializer_fields (serializer )
265
- serializer_data = resource [ field_name ]
264
+ serializer_data = resource . get ( field_name )
266
265
if isinstance (serializer_data , list ):
267
266
for serializer_resource in serializer_data :
268
267
relation_data .append (
@@ -279,14 +278,14 @@ def extract_relationships(fields, resource):
279
278
280
279
# Get the serializer fields
281
280
serializer_fields = get_serializer_fields (field )
282
- serializer_data = resource [ field_name ]
281
+ serializer_data = resource . get ( field_name )
283
282
data .update ({
284
283
field_name : {
285
284
'data' : (
286
285
OrderedDict ([
287
286
('type' , relation_type ),
288
287
('id' , extract_id (serializer_fields , serializer_data ))
289
- ]) if resource [ field_name ] else None )
288
+ ]) if resource . get ( field_name ) else None )
290
289
}
291
290
})
292
291
continue
@@ -313,7 +312,7 @@ def extract_included(fields, resource):
313
312
314
313
# Get the serializer fields
315
314
serializer_fields = get_serializer_fields (serializer )
316
- serializer_data = resource [ field_name ]
315
+ serializer_data = resource . get ( field_name )
317
316
if isinstance (serializer_data , list ):
318
317
for serializer_resource in serializer_data :
319
318
included_data .append (build_json_resource_obj (serializer_fields , serializer_resource , relation_type ))
@@ -325,7 +324,7 @@ def extract_included(fields, resource):
325
324
326
325
# Get the serializer fields
327
326
serializer_fields = get_serializer_fields (field )
328
- serializer_data = resource [ field_name ]
327
+ serializer_data = resource . get ( field_name )
329
328
if serializer_data :
330
329
included_data .append (build_json_resource_obj (serializer_fields , serializer_data , relation_type ))
331
330
0 commit comments