Skip to content

Commit 314ea5a

Browse files
author
Boris Pleshakov
committed
support nested structures
1 parent 2033bc5 commit 314ea5a

File tree

7 files changed

+234
-96
lines changed

7 files changed

+234
-96
lines changed

example/serializers.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,23 @@ def get_first_entry(self, obj):
257257
return obj.entries.first()
258258

259259

260+
class CommentWithNestedFieldsSerializer(serializers.ModelSerializer):
261+
entry = EntryDRFSerializers()
262+
263+
class Meta:
264+
model = Comment
265+
exclude = ('created_at', 'modified_at', 'author')
266+
# fields = ('entry', 'body', 'author',)
267+
268+
269+
class AuthorWithNestedFieldsSerializer(serializers.ModelSerializer):
270+
comments = CommentWithNestedFieldsSerializer(many=True)
271+
272+
class Meta:
273+
model = Author
274+
fields = ('name', 'email', 'comments')
275+
276+
260277
class WriterSerializer(serializers.ModelSerializer):
261278
included_serializers = {
262279
'bio': AuthorBioSerializer
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from __future__ import absolute_import
2+
3+
import json
4+
5+
from django.utils import timezone
6+
from rest_framework.reverse import reverse
7+
8+
from . import TestBase
9+
from example.models import Author, Blog, Comment, Entry
10+
from django.test import override_settings
11+
12+
13+
class TestResourceRelatedField(TestBase):
14+
list_url = reverse('authors-nested-list')
15+
16+
def setUp(self):
17+
super(TestResourceRelatedField, self).setUp()
18+
self.blog = Blog.objects.create(name='Some Blog', tagline="It's a blog")
19+
self.entry = Entry.objects.create(
20+
blog=self.blog,
21+
headline='headline',
22+
body_text='body_text',
23+
pub_date=timezone.now(),
24+
mod_date=timezone.now(),
25+
n_comments=0,
26+
n_pingbacks=0,
27+
rating=3
28+
)
29+
for i in range(1, 6):
30+
name = 'some_author{}'.format(i)
31+
self.entry.authors.add(
32+
Author.objects.create(name=name, email='{}@example.org'.format(name))
33+
)
34+
35+
self.comment = Comment.objects.create(
36+
entry=self.entry,
37+
body='testing one two three',
38+
author=Author.objects.first()
39+
)
40+
41+
def test_attribute_rendering_strategy(self):
42+
with override_settings(JSON_API_NESTED_SERIALIZERS_RENDERING_STRATEGY='ATTRIBUTE'):
43+
response = self.client.get(self.list_url)
44+
45+
expected = {
46+
"links": {
47+
"first": "http://testserver/authors-nested?page%5Bnumber%5D=1",
48+
"last": "http://testserver/authors-nested?page%5Bnumber%5D=5",
49+
"next": "http://testserver/authors-nested?page%5Bnumber%5D=2",
50+
"prev": None
51+
},
52+
"data": [
53+
{
54+
"type": "authors",
55+
"id": "1",
56+
"attributes": {
57+
"name": "some_author1",
58+
"email": "[email protected]",
59+
"comments": [
60+
{
61+
"id": 1,
62+
"entry": {
63+
"tags": [],
64+
"url": "http://testserver/drf-blogs/1"
65+
},
66+
"body": "testing one two three"
67+
}
68+
]
69+
}
70+
}
71+
],
72+
"meta": {
73+
"pagination": {
74+
"page": 1,
75+
"pages": 5,
76+
"count": 5
77+
}
78+
}
79+
}
80+
assert expected == response.json()

example/urls_test.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
NoFiltersetEntryViewSet,
1919
NonPaginatedEntryViewSet,
2020
ProjectTypeViewset,
21-
ProjectViewset
21+
ProjectViewset,
22+
AuthorWithNestedFieldsViewSet
2223
)
2324

2425
router = routers.DefaultRouter(trailing_slash=False)
@@ -32,6 +33,7 @@
3233
router.register(r'filterset-entries', FiltersetEntryViewSet, 'filterset-entry')
3334
router.register(r'nofilterset-entries', NoFiltersetEntryViewSet, 'nofilterset-entry')
3435
router.register(r'authors', AuthorViewSet)
36+
router.register(r'authors-nested', AuthorWithNestedFieldsViewSet, 'authors-nested')
3537
router.register(r'comments', CommentViewSet)
3638
router.register(r'companies', CompanyViewset)
3739
router.register(r'projects', ProjectViewset)

example/views.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
EntryDRFSerializers,
2424
EntrySerializer,
2525
ProjectSerializer,
26-
ProjectTypeSerializer
27-
)
26+
ProjectTypeSerializer,
27+
AuthorWithNestedFieldsSerializer)
2828

2929
HTTP_422_UNPROCESSABLE_ENTITY = 422
3030

@@ -175,6 +175,11 @@ class AuthorViewSet(ModelViewSet):
175175
serializer_class = AuthorSerializer
176176

177177

178+
class AuthorWithNestedFieldsViewSet(ModelViewSet):
179+
queryset = Author.objects.all()
180+
serializer_class = AuthorWithNestedFieldsSerializer
181+
182+
178183
class CommentViewSet(ModelViewSet):
179184
queryset = Comment.objects.all()
180185
serializer_class = CommentSerializer

0 commit comments

Comments
 (0)