1010from rest_framework import exceptions
1111from rest_framework .exceptions import APIException
1212
13+ import django
1314from django .conf import settings
1415from django .db .models import Manager
1516from django .utils import encoding , six
2627except ImportError :
2728 HyperlinkedRouterField = type (None )
2829
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+
2938
3039def get_resource_name (context ):
3140 """
@@ -169,7 +178,6 @@ def get_related_resource_type(relation):
169178 return get_resource_type_from_serializer (relation )
170179 except AttributeError :
171180 pass
172-
173181 relation_model = None
174182 if hasattr (relation , '_meta' ):
175183 relation_model = relation ._meta .model
@@ -195,19 +203,17 @@ def get_related_resource_type(relation):
195203 else :
196204 parent_model_relation = getattr (parent_model , parent_serializer .field_name )
197205
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 ):
200210 relation_model = parent_model_relation .related .related_model
201- except AttributeError :
202- # Django 1.7
211+ else :
203212 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
211217 else :
212218 return get_related_resource_type (parent_model_relation )
213219
0 commit comments