Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 18 additions & 12 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /