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 c752091

Browse files
committed
Close #130. Data is now included on detail and list endpoints
1 parent 6178390 commit c752091

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
11
import pytest, json
22
from django.core.urlresolvers import reverse
3+
from example.tests.utils import load_json
34

45
pytestmark = pytest.mark.django_db
56

67

7-
def test_included_data_on_list(single_entry, client):
8+
def test_included_data_on_list(multiple_entries, client):
9+
multiple_entries[1].comments = []
810
response = client.get(reverse("entry-list") + '?include=comments')
9-
included = json.loads(response.content).get('included')
11+
included = load_json(response.content).get('included')
1012

1113
assert [x.get('type') for x in included] == ['comments']
1214

1315
def test_included_data_on_detail(single_entry, client):
1416
response = client.get(reverse("entry-detail", kwargs={'pk': single_entry.pk}) + '?include=comments')
15-
included = json.loads(response.content).get('included')
17+
included = load_json(response.content).get('included')
1618

1719
assert [x.get('type') for x in included] == ['comments']
1820

‎example/tests/utils.py‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
from django.utils.encoding import force_bytes, force_text
44

55

6+
def load_json(data):
7+
return json.loads(force_text(data))
8+
9+
610
def dump_json(data):
711
'''
812
Converts a Python object to a JSON formatted string.

‎rest_framework_json_api/utils.py‎

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -402,8 +402,11 @@ def extract_relationships(fields, resource, resource_instance):
402402

403403

404404
def extract_included(fields, resource, resource_instance, included_resources):
405-
included_data = list()
405+
# this function may be called with an empty record (example: Browsable Interface)
406+
if not resource_instance:
407+
return
406408

409+
included_data = list()
407410
current_serializer = fields.serializer
408411
context = current_serializer.context
409412
included_serializers = get_included_serializers(current_serializer)
@@ -419,13 +422,19 @@ def extract_included(fields, resource, resource_instance, included_resources):
419422

420423
try:
421424
included_resources.remove(field_name)
422-
new_included_resources = [key.replace('%s.' % field_name, '', 1) for key in included_resources]
423-
relation_instance_or_manager = getattr(resource_instance, field_name)
424-
serializer_data = resource.get(field_name)
425425
except ValueError:
426426
# Skip fields not in requested included resources
427427
continue
428428

429+
try:
430+
relation_instance_or_manager = getattr(resource_instance, field_name)
431+
except AttributeError:
432+
# For ManyRelatedFields if `related_name` is not set we need to access `foo_set` from `source`
433+
relation_instance_or_manager = getattr(resource_instance, field.child_relation.source)
434+
435+
new_included_resources = [key.replace('%s.' % field_name, '', 1) for key in included_resources]
436+
serializer_data = resource.get(field_name)
437+
429438
if isinstance(field, ManyRelatedField):
430439
serializer_class = included_serializers.get(field_name)
431440
field = serializer_class(relation_instance_or_manager.all(), many=True, context=context)

0 commit comments

Comments
(0)

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