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 eba3fe8

Browse files
committed
Fix wrong resource type for reverse FKs, add failing test.
1 parent e96230c commit eba3fe8

File tree

2 files changed

+33
-7
lines changed

2 files changed

+33
-7
lines changed

‎example/tests/test_utils.py‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
"""
2+
Test rest_framework_json_api's utils functions.
3+
"""
4+
from rest_framework_json_api import utils
5+
6+
from ..serializers import EntrySerializer
7+
from ..tests import TestBase
8+
9+
10+
class GetRelatedResourceTests(TestBase):
11+
"""
12+
Ensure the `get_related_resource_type` function returns correct types.
13+
"""
14+
15+
def test_reverse_relation(self):
16+
"""
17+
Ensure reverse foreign keys have their types identified correctly.
18+
"""
19+
serializer = EntrySerializer()
20+
field = serializer.fields['comments']
21+
22+
self.assertEqual(utils.get_related_resource_type(field), 'comments')

‎rest_framework_json_api/utils.py‎

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22
Utils.
33
"""
44
import copy
5+
import inspect
56
import warnings
67
from collections import OrderedDict
7-
import inspect
88

99
import inflection
10+
from rest_framework import exceptions
11+
from rest_framework.exceptions import APIException
12+
1013
from django.conf import settings
11-
from django.utils import encoding
12-
from django.utils import six
14+
from django.db.models import Manager
15+
from django.utils import encoding, six
1316
from django.utils.module_loading import import_string as import_class_from_dotted_path
1417
from django.utils.translation import ugettext_lazy as _
15-
from django.db.models import Manager
16-
from rest_framework.exceptions import APIException
17-
from rest_framework import exceptions
1818

1919
try:
2020
from rest_framework.serializers import ManyRelatedField
@@ -87,6 +87,7 @@ def get_serializer_fields(serializer):
8787
pass
8888
return fields
8989

90+
9091
def format_keys(obj, format_type=None):
9192
"""
9293
Takes either a dict or list and returns it with camelized keys only if
@@ -148,6 +149,7 @@ def format_relation_name(value, format_type=None):
148149
pluralize = getattr(settings, 'JSON_API_PLURALIZE_RELATION_TYPE', None)
149150
return format_resource_type(value, format_type, pluralize)
150151

152+
151153
def format_resource_type(value, format_type=None, pluralize=None):
152154
if format_type is None:
153155
format_type = getattr(settings, 'JSON_API_FORMAT_TYPES', False)
@@ -184,7 +186,7 @@ def get_related_resource_type(relation):
184186
elif hasattr(parent_serializer, 'parent') and hasattr(parent_serializer.parent, 'Meta'):
185187
parent_model = getattr(parent_serializer.parent.Meta, 'model', None)
186188

187-
if parent_model is not None:
189+
if parent_model is not None:
188190
if relation.source:
189191
if relation.source != '*':
190192
parent_model_relation = getattr(parent_model, relation.source)
@@ -199,6 +201,8 @@ def get_related_resource_type(relation):
199201
except AttributeError:
200202
# Django 1.7
201203
relation_model = parent_model_relation.related.model
204+
elif hasattr(parent_model_relation, 'rel'):
205+
relation_model = parent_model_relation.rel.related_model
202206
elif hasattr(parent_model_relation, 'field'):
203207
try:
204208
relation_model = parent_model_relation.field.remote_field.model

0 commit comments

Comments
(0)

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