13
13
14
14
from django .utils .six .moves .urllib .parse import urlparse
15
15
16
+
16
17
try :
17
18
from rest_framework .compat import OrderedDict
18
19
except ImportError :
23
24
except ImportError :
24
25
ManyRelatedField = type (None )
25
26
27
+ try :
28
+ from rest_framework_nested .relations import HyperlinkedRouterField
29
+ except ImportError :
30
+ HyperlinkedRouterField = type (None )
31
+
26
32
27
33
def get_resource_name (context ):
28
34
"""
@@ -122,13 +128,13 @@ def format_value(value, format_type=None):
122
128
return value
123
129
124
130
125
- def build_json_resource_obj (fields , resource , resource_name ):
131
+ def build_json_resource_obj (fields , resource , resource_instance , resource_name ):
126
132
resource_data = [
127
133
('type' , resource_name ),
128
134
('id' , extract_id (fields , resource )),
129
135
('attributes' , extract_attributes (fields , resource )),
130
136
]
131
- relationships = extract_relationships (fields , resource )
137
+ relationships = extract_relationships (fields , resource , resource_instance )
132
138
if relationships :
133
139
resource_data .append (('relationships' , relationships ))
134
140
# Add 'self' link if field is present and valid
@@ -139,9 +145,8 @@ def build_json_resource_obj(fields, resource, resource_name):
139
145
140
146
141
147
def get_related_resource_type (relation ):
142
- queryset = relation .queryset
143
- if queryset is not None :
144
- relation_model = queryset .model
148
+ if hasattr (relation , 'get_queryset' ) and relation .get_queryset () is not None :
149
+ relation_model = relation .get_queryset ().model
145
150
else :
146
151
parent_serializer = relation .parent
147
152
if hasattr (parent_serializer , 'Meta' ):
@@ -198,7 +203,7 @@ def extract_attributes(fields, resource):
198
203
return format_keys (data )
199
204
200
205
201
- def extract_relationships (fields , resource ):
206
+ def extract_relationships (fields , resource , resource_instance ):
202
207
data = OrderedDict ()
203
208
for field_name , field in six .iteritems (fields ):
204
209
# Skip URL field
@@ -209,6 +214,24 @@ def extract_relationships(fields, resource):
209
214
if not isinstance (field , (RelatedField , ManyRelatedField , BaseSerializer )):
210
215
continue
211
216
217
+ if isinstance (field , HyperlinkedRouterField ):
218
+ # special case for HyperlinkedRouterField
219
+ relation_data = list ()
220
+ relation_type = get_related_resource_type (field )
221
+ related = getattr (resource_instance , field_name ).all ()
222
+ for relation in related :
223
+ relation_data .append (OrderedDict ([('type' , relation_type ), ('id' , relation .pk )]))
224
+
225
+ data .update ({field_name : {
226
+ 'links' : {
227
+ "related" : resource .get (field_name )},
228
+ 'data' : relation_data ,
229
+ 'meta' : {
230
+ 'count' : len (relation_data )
231
+ }
232
+ }})
233
+ continue
234
+
212
235
if isinstance (field , (PrimaryKeyRelatedField , HyperlinkedRelatedField )):
213
236
relation_type = get_related_resource_type (field )
214
237
0 commit comments