Skip to content

Commit b965727

Browse files
committed
Explicit version checks
1 parent d7df867 commit b965727

File tree

1 file changed

+18
-12
lines changed

1 file changed

+18
-12
lines changed

‎rest_framework_json_api/utils.py

+18-12
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from rest_framework import exceptions
1111
from rest_framework.exceptions import APIException
1212

13+
import django
1314
from django.conf import settings
1415
from django.db.models import Manager
1516
from django.utils import encoding, six
@@ -26,6 +27,14 @@
2627
except 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

3039
def 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

Comments
 (0)