5
5
from collections import OrderedDict
6
6
7
7
import inflection
8
- from django .db .models import Manager , QuerySet
8
+ from django .db .models import Manager
9
9
from django .utils import six , encoding
10
10
from rest_framework import relations
11
11
from rest_framework import renderers
@@ -111,8 +111,10 @@ def get_pk(obj):
111
111
if relation_instance is not None else list ()
112
112
113
113
for related_object in relation_queryset :
114
- relation_data .append (
115
- OrderedDict ([('type' , relation_type ), ('id' , encoding .force_text (get_pk (related_object )))])
114
+ relation_data .append (OrderedDict ([
115
+ ('type' , relation_type ),
116
+ ('id' , encoding .force_text (getattr (
117
+ related_object , field .lookup_field )))])
116
118
)
117
119
118
120
data .update ({field_name : {
@@ -144,12 +146,18 @@ def get_pk(obj):
144
146
continue
145
147
146
148
if isinstance (field , (relations .PrimaryKeyRelatedField , relations .HyperlinkedRelatedField )):
147
- resolved , relation = utils .get_relation_instance (resource_instance , '%s_id' % source , field .parent )
148
- if not resolved :
149
- continue
150
- relation_id = get_pk (
151
- getattr (resource_instance , source )
152
- ) if resource .get (field_name ) else None
149
+ lookup_field = getattr (field , 'lookup_field' , None )
150
+ if lookup_field :
151
+ relation_id = getattr (
152
+ getattr (resource_instance , source ), lookup_field )
153
+ else :
154
+ resolved , relation = utils .get_relation_instance (
155
+ resource_instance , source , field .parent )
156
+ if not resolved :
157
+ continue
158
+ relation_id = get_pk (
159
+ getattr (resource_instance , source )
160
+ ) if resource .get (field_name ) else None
153
161
relation_data = {
154
162
'data' : (
155
163
OrderedDict ([('type' , relation_type ), ('id' , encoding .force_text (relation_id ))])
@@ -198,7 +206,9 @@ def get_pk(obj):
198
206
199
207
relation_data .append (OrderedDict ([
200
208
('type' , nested_resource_instance_type ),
201
- ('id' , encoding .force_text (get_pk (nested_resource_instance )))
209
+ ('id' , encoding .force_text (getattr (
210
+ nested_resource_instance ,
211
+ field .child_relation .lookup_field )))
202
212
]))
203
213
data .update ({
204
214
field_name : {
@@ -228,7 +238,9 @@ def get_pk(obj):
228
238
utils .get_resource_type_from_instance (nested_resource_instance )
229
239
)
230
240
231
- instance_pk_name = nested_resource_instance ._meta .pk .name
241
+ instance_pk_name = (
242
+ getattr (field , 'lookup_field' , None ) or
243
+ nested_resource_instance ._meta .pk .name )
232
244
if instance_pk_name in nested_resource_data :
233
245
pk = nested_resource_data [instance_pk_name ]
234
246
else :
@@ -247,12 +259,19 @@ def get_pk(obj):
247
259
if not resolved :
248
260
continue
249
261
262
+ url_field_name = getattr (field , 'url_field_name' , 'url' )
263
+ if url_field_name in field .fields :
264
+ id_ = getattr (
265
+ relation_instance ,
266
+ field [url_field_name ].lookup_field )
267
+ else :
268
+ id_ = get_pk (relation_instance )
250
269
data .update ({
251
270
field_name : {
252
271
'data' : (
253
272
OrderedDict ([
254
273
('type' , relation_type ),
255
- ('id' , get_pk ( relation_instance ))
274
+ ('id' , encoding . force_text ( id_ ))
256
275
]) if resource .get (field_name ) else None )
257
276
}
258
277
})
@@ -402,6 +421,12 @@ def extract_root_meta(cls, serializer, resource):
402
421
def build_json_resource_obj (cls , fields , resource , resource_instance , resource_name ):
403
422
if resource_instance is None :
404
423
pk = None
424
+ elif 'url' in fields :
425
+ pk = getattr (resource_instance , fields ['url' ].lookup_field )
426
+ pk = encoding .force_text (pk )
427
+ elif 'id' in fields :
428
+ pk = fields ['id' ].get_attribute (resource_instance )
429
+ pk = encoding .force_text (pk )
405
430
else :
406
431
# Check if the primary key exists in the resource by getting the primary keys attribute name.
407
432
pk_attr = resource_instance ._meta .pk .name
0 commit comments