|
7 | 7 | from django.utils import six, encoding
|
8 | 8 | from django.utils.translation import ugettext_lazy as _
|
9 | 9 | from rest_framework.serializers import BaseSerializer, ListSerializer, ModelSerializer
|
10 |
| -from rest_framework.relations import RelatedField, HyperlinkedRelatedField, PrimaryKeyRelatedField |
| 10 | +from rest_framework.relations import RelatedField, HyperlinkedRelatedField, PrimaryKeyRelatedField, \ |
| 11 | + HyperlinkedIdentityField |
11 | 12 | from rest_framework.settings import api_settings
|
12 | 13 | from rest_framework.exceptions import APIException
|
13 | 14 |
|
@@ -152,10 +153,15 @@ def get_related_resource_type(relation):
|
152 | 153 | parent_model = parent_serializer.Meta.model
|
153 | 154 | else:
|
154 | 155 | parent_model = parent_serializer.parent.Meta.model
|
155 |
| - parent_model_relation = getattr( |
156 |
| - parent_model, |
157 |
| - (relation.source if relation.source else parent_serializer.field_name) |
158 |
| - ) |
| 156 | + |
| 157 | + if relation.source: |
| 158 | + if relation.source != '*': |
| 159 | + parent_model_relation = getattr(parent_model, relation.source) |
| 160 | + else: |
| 161 | + parent_model_relation = getattr(parent_model, relation.field_name) |
| 162 | + else: |
| 163 | + parent_model_relation = getattr(parent_model, parent_serializer.field_name) |
| 164 | + |
159 | 165 | if hasattr(parent_model_relation, 'related'):
|
160 | 166 | relation_model = parent_model_relation.related.model
|
161 | 167 | elif hasattr(parent_model_relation, 'field'):
|
@@ -231,6 +237,24 @@ def extract_relationships(fields, resource, resource_instance):
|
231 | 237 | }})
|
232 | 238 | continue
|
233 | 239 |
|
| 240 | + if isinstance(field, HyperlinkedIdentityField): |
| 241 | + # special case for HyperlinkedIdentityField |
| 242 | + relation_data = list() |
| 243 | + relation_type = get_related_resource_type(field) |
| 244 | + related = getattr(resource_instance, field_name).all() |
| 245 | + for relation in related: |
| 246 | + relation_data.append(OrderedDict([('type', relation_type), ('id', relation.pk)])) |
| 247 | + |
| 248 | + data.update({field_name: { |
| 249 | + 'links': { |
| 250 | + "related": resource.get(field_name)}, |
| 251 | + 'data': relation_data, |
| 252 | + 'meta': { |
| 253 | + 'count': len(relation_data) |
| 254 | + } |
| 255 | + }}) |
| 256 | + continue |
| 257 | + |
234 | 258 | if isinstance(field, (PrimaryKeyRelatedField, HyperlinkedRelatedField)):
|
235 | 259 | relation_type = get_related_resource_type(field)
|
236 | 260 | relation_id = getattr(resource_instance, field_name).pk if resource.get(field_name) else None
|
|
0 commit comments