Skip to content

Commit 629d1d6

Browse files
Darkheirmblayman
authored andcommitted
Fixes types in reverse m2m relationships (#355)
* Adds test that fails with reverse m2m relationships * Fixes reverse m2m relationships * Adds compatibility with Django 1.8 * Update AUTHORS
1 parent ab4e1bd commit 629d1d6

File tree

5 files changed

+24
-5
lines changed

5 files changed

+24
-5
lines changed

AUTHORS

+1
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ Greg Aker <greg@gregaker.net>
44
Jerel Unruh <mail@unruhdesigns.com>
55
Matt Layman <http://www.mattlayman.com>
66
Oliver Sauder <os@esite.ch>
7+
Raphael Cohen <raphael.cohen.utt@gmail.com>
78
Yaniv Peer <yanivpeer@gmail.com>

example/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class Entry(BaseModel):
6464
body_text = models.TextField(null=True)
6565
pub_date = models.DateField(null=True)
6666
mod_date = models.DateField(null=True)
67-
authors = models.ManyToManyField(Author)
67+
authors = models.ManyToManyField(Author, related_name='entries')
6868
n_comments = models.IntegerField(default=0)
6969
n_pingbacks = models.IntegerField(default=0)
7070
rating = models.IntegerField(default=0)

example/serializers.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class AuthorBioSerializer(serializers.ModelSerializer):
9292

9393
class Meta:
9494
model = AuthorBio
95-
fields = ('author', 'body',)
95+
fields = ('author', 'body')
9696

9797

9898
class AuthorSerializer(serializers.ModelSerializer):
@@ -102,7 +102,7 @@ class AuthorSerializer(serializers.ModelSerializer):
102102

103103
class Meta:
104104
model = Author
105-
fields = ('name', 'email', 'bio')
105+
fields = ('name', 'email', 'bio', 'entries')
106106

107107

108108
class CommentSerializer(serializers.ModelSerializer):

example/tests/test_utils.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44
from rest_framework_json_api import utils
55

6-
from ..serializers import EntrySerializer
6+
from ..serializers import EntrySerializer, AuthorSerializer
77
from ..tests import TestBase
88

99

@@ -29,3 +29,12 @@ def test_m2m_relation(self):
2929
field = serializer.fields['authors']
3030

3131
self.assertEqual(utils.get_related_resource_type(field), 'authors')
32+
33+
def test_m2m_reverse_relation(self):
34+
"""
35+
Ensure reverse m2ms have their types identified correctly.
36+
"""
37+
serializer = AuthorSerializer()
38+
field = serializer.fields['entries']
39+
40+
self.assertEqual(utils.get_related_resource_type(field), 'entries')

rest_framework_json_api/utils.py

+10-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,16 @@ def get_related_resource_type(relation):
237237
else:
238238
relation_model = parent_model_relation.related.model
239239
elif parent_model_relation_type is ManyToManyDescriptor:
240-
relation_model = parent_model_relation.field.remote_field.model
240+
if django.VERSION >= (1, 9):
241+
relation_model = parent_model_relation.field.remote_field.model
242+
# In case we are in a reverse relation
243+
if relation_model == parent_model:
244+
relation_model = parent_model_relation.field.model
245+
elif django.VERSION >= (1, 8):
246+
relation_model = parent_model_relation.related.model
247+
# In case we are in a reverse relation
248+
if relation_model == parent_model:
249+
relation_model = parent_model_relation.related.related_model
241250
elif parent_model_relation_type is ReverseManyRelatedObjectsDescriptor:
242251
relation_model = parent_model_relation.field.related.model
243252
elif parent_model_relation_type is ReverseGenericManyToOneDescriptor:

0 commit comments

Comments
 (0)