11import json
22
33import pytest
4+ from django .test import override_settings
5+ from django .utils import timezone
46
7+ from example .tests import TestBase
58from rest_framework_json_api import serializers , views
69from rest_framework_json_api .renderers import JSONRenderer
710
8- from example .models import Author , Comment , Entry
11+ from example .models import Author , Comment , Entry , Blog
912
1013
1114# serializers
@@ -38,6 +41,31 @@ class JSONAPIMeta:
3841 included_resources = ('related_models' ,)
3942
4043
44+ class EntryDRFSerializers (serializers .ModelSerializer ):
45+
46+ class Meta :
47+ model = Entry
48+ fields = ('headline' , 'body_text' )
49+ read_only_fields = ('tags' ,)
50+
51+
52+ class CommentWithNestedFieldsSerializer (serializers .ModelSerializer ):
53+ entry = EntryDRFSerializers ()
54+
55+ class Meta :
56+ model = Comment
57+ exclude = ('created_at' , 'modified_at' , 'author' )
58+ # fields = ('entry', 'body', 'author',)
59+
60+
61+ class AuthorWithNestedFieldsSerializer (serializers .ModelSerializer ):
62+ comments = CommentWithNestedFieldsSerializer (many = True )
63+
64+ class Meta :
65+ model = Author
66+ fields = ('name' , 'email' , 'comments' )
67+
68+
4169# views
4270class DummyTestViewSet (views .ModelViewSet ):
4371 queryset = Entry .objects .all ()
@@ -49,6 +77,12 @@ class ReadOnlyDummyTestViewSet(views.ReadOnlyModelViewSet):
4977 serializer_class = DummyTestSerializer
5078
5179
80+ class AuthorWithNestedFieldsViewSet (views .ModelViewSet ):
81+ queryset = Author .objects .all ()
82+ serializer_class = AuthorWithNestedFieldsSerializer
83+ resource_name = 'authors'
84+
85+
5286def render_dummy_test_serialized_view (view_class , instance ):
5387 serializer = view_class .serializer_class (instance = instance )
5488 renderer = JSONRenderer ()
@@ -138,3 +172,57 @@ def test_extract_relation_instance(comment):
138172 field = serializer .fields ['blog' ], resource_instance = comment
139173 )
140174 assert got == comment .entry .blog
175+
176+
177+ class TestRenderingStrategy (TestBase ):
178+
179+ def setUp (self ):
180+ super (TestRenderingStrategy , self ).setUp ()
181+ self .blog = Blog .objects .create (name = 'Some Blog' , tagline = "It's a blog" )
182+ self .entry = Entry .objects .create (
183+ blog = self .blog ,
184+ headline = 'headline' ,
185+ body_text = 'body_text' ,
186+ pub_date = timezone .now (),
187+ mod_date = timezone .now (),
188+ n_comments = 0 ,
189+ n_pingbacks = 0 ,
190+ rating = 3
191+ )
192+
193+ self .author = Author .objects .create (name = 'some_author' , email = 'some_author@example.org' )
194+ self .entry .authors .add (self .author )
195+
196+ self .comment = Comment .objects .create (
197+ entry = self .entry ,
198+ body = 'testing one two three' ,
199+ author = Author .objects .first ()
200+ )
201+
202+ def test_attribute_rendering_strategy (self ):
203+ with override_settings (
204+ JSON_API_SERIALIZE_NESTED_SERIALIZERS_AS_ATTRIBUTE = True ):
205+ rendered = render_dummy_test_serialized_view (AuthorWithNestedFieldsViewSet , self .author )
206+ result = json .loads (rendered .decode ())
207+
208+ expected = {
209+ "data" : {
210+ "type" : "authors" ,
211+ "id" : "1" ,
212+ "attributes" : {
213+ "name" : "some_author" ,
214+ "email" : "some_author@example.org" ,
215+ "comments" : [
216+ {
217+ "id" : 1 ,
218+ "entry" : {
219+ 'headline' : 'headline' ,
220+ 'body_text' : 'body_text' ,
221+ },
222+ "body" : "testing one two three"
223+ }
224+ ]
225+ }
226+ }
227+ }
228+ self .assertDictEqual (expected , result )
0 commit comments