10
10
from rest_framework import exceptions
11
11
from rest_framework .exceptions import APIException
12
12
13
+ import django
13
14
from django .conf import settings
14
15
from django .db .models import Manager
15
16
from django .utils import encoding , six
26
27
except ImportError :
27
28
HyperlinkedRouterField = type (None )
28
29
30
+ if django .VERSION >= (1 , 9 ):
31
+ from django .db .models .fields .related_descriptors import ManyToManyDescriptor , ReverseManyToOneDescriptor
32
+ ReverseManyRelatedObjectsDescriptor = type (None )
33
+ else :
34
+ from django .db .models .fields .related import ManyRelatedObjectsDescriptor as ManyToManyDescriptor
35
+ from django .db .models .fields .related import ForeignRelatedObjectsDescriptor as ReverseManyToOneDescriptor
36
+ from django .db .models .fields .related import ReverseManyRelatedObjectsDescriptor
37
+
29
38
30
39
def get_resource_name (context ):
31
40
"""
@@ -169,7 +178,6 @@ def get_related_resource_type(relation):
169
178
return get_resource_type_from_serializer (relation )
170
179
except AttributeError :
171
180
pass
172
-
173
181
relation_model = None
174
182
if hasattr (relation , '_meta' ):
175
183
relation_model = relation ._meta .model
@@ -195,19 +203,17 @@ def get_related_resource_type(relation):
195
203
else :
196
204
parent_model_relation = getattr (parent_model , parent_serializer .field_name )
197
205
198
- if hasattr (parent_model_relation , 'related' ):
199
- try :
206
+ if type (parent_model_relation ) is ReverseManyToOneDescriptor :
207
+ if django .VERSION >= (1 , 9 ):
208
+ relation_model = parent_model_relation .rel .related_model
209
+ elif django .VERSION >= (1 , 8 ):
200
210
relation_model = parent_model_relation .related .related_model
201
- except AttributeError :
202
- # Django 1.7
211
+ else :
203
212
relation_model = parent_model_relation .related .model
204
- elif hasattr (parent_model_relation , 'rel' ):
205
- relation_model = parent_model_relation .rel .related_model
206
- elif hasattr (parent_model_relation , 'field' ):
207
- try :
208
- relation_model = parent_model_relation .field .remote_field .model
209
- except AttributeError :
210
- relation_model = parent_model_relation .field .related .model
213
+ elif type (parent_model_relation ) is ManyToManyDescriptor :
214
+ relation_model = parent_model_relation .field .remote_field .model
215
+ elif type (parent_model_relation ) is ReverseManyRelatedObjectsDescriptor :
216
+ relation_model = parent_model_relation .field .related .model
211
217
else :
212
218
return get_related_resource_type (parent_model_relation )
213
219
0 commit comments