diff --git a/AUTHORS b/AUTHORS index 419f2e90..040fb7d9 100644 --- a/AUTHORS +++ b/AUTHORS @@ -4,4 +4,5 @@ Greg Aker Jerel Unruh Matt Layman Oliver Sauder +Raphael Cohen Yaniv Peer diff --git a/example/models.py b/example/models.py index 6442b0e4..68b0e57b 100644 --- a/example/models.py +++ b/example/models.py @@ -64,7 +64,7 @@ class Entry(BaseModel): body_text = models.TextField(null=True) pub_date = models.DateField(null=True) mod_date = models.DateField(null=True) - authors = models.ManyToManyField(Author) + authors = models.ManyToManyField(Author, related_name='entries') n_comments = models.IntegerField(default=0) n_pingbacks = models.IntegerField(default=0) rating = models.IntegerField(default=0) diff --git a/example/serializers.py b/example/serializers.py index 0dfc49b4..37d76803 100644 --- a/example/serializers.py +++ b/example/serializers.py @@ -92,7 +92,7 @@ class AuthorBioSerializer(serializers.ModelSerializer): class Meta: model = AuthorBio - fields = ('author', 'body',) + fields = ('author', 'body') class AuthorSerializer(serializers.ModelSerializer): @@ -102,7 +102,7 @@ class AuthorSerializer(serializers.ModelSerializer): class Meta: model = Author - fields = ('name', 'email', 'bio') + fields = ('name', 'email', 'bio', 'entries') class CommentSerializer(serializers.ModelSerializer): diff --git a/example/tests/test_utils.py b/example/tests/test_utils.py index 3772ebe1..d431db12 100644 --- a/example/tests/test_utils.py +++ b/example/tests/test_utils.py @@ -3,7 +3,7 @@ """ from rest_framework_json_api import utils -from ..serializers import EntrySerializer +from ..serializers import EntrySerializer, AuthorSerializer from ..tests import TestBase @@ -29,3 +29,12 @@ def test_m2m_relation(self): field = serializer.fields['authors'] self.assertEqual(utils.get_related_resource_type(field), 'authors') + + def test_m2m_reverse_relation(self): + """ + Ensure reverse m2ms have their types identified correctly. + """ + serializer = AuthorSerializer() + field = serializer.fields['entries'] + + self.assertEqual(utils.get_related_resource_type(field), 'entries') diff --git a/rest_framework_json_api/utils.py b/rest_framework_json_api/utils.py index f2eefa2b..85d70c0a 100644 --- a/rest_framework_json_api/utils.py +++ b/rest_framework_json_api/utils.py @@ -237,7 +237,16 @@ def get_related_resource_type(relation): else: relation_model = parent_model_relation.related.model elif parent_model_relation_type is ManyToManyDescriptor: - relation_model = parent_model_relation.field.remote_field.model + if django.VERSION >= (1, 9): + relation_model = parent_model_relation.field.remote_field.model + # In case we are in a reverse relation + if relation_model == parent_model: + relation_model = parent_model_relation.field.model + elif django.VERSION >= (1, 8): + relation_model = parent_model_relation.related.model + # In case we are in a reverse relation + if relation_model == parent_model: + relation_model = parent_model_relation.related.related_model elif parent_model_relation_type is ReverseManyRelatedObjectsDescriptor: relation_model = parent_model_relation.field.related.model elif parent_model_relation_type is ReverseGenericManyToOneDescriptor: