1
1
import json
2
2
3
3
import pytest
4
+ from django .test import override_settings
5
+ from django .utils import timezone
4
6
7
+ from example .tests import TestBase
5
8
from rest_framework_json_api import serializers , views
6
9
from rest_framework_json_api .renderers import JSONRenderer
7
10
8
- from example .models import Author , Comment , Entry
11
+ from example .models import Author , Comment , Entry , Blog
9
12
10
13
11
14
# serializers
@@ -38,6 +41,31 @@ class JSONAPIMeta:
38
41
included_resources = ('related_models' ,)
39
42
40
43
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
+
41
69
# views
42
70
class DummyTestViewSet (views .ModelViewSet ):
43
71
queryset = Entry .objects .all ()
@@ -49,6 +77,12 @@ class ReadOnlyDummyTestViewSet(views.ReadOnlyModelViewSet):
49
77
serializer_class = DummyTestSerializer
50
78
51
79
80
+ class AuthorWithNestedFieldsViewSet (views .ModelViewSet ):
81
+ queryset = Author .objects .all ()
82
+ serializer_class = AuthorWithNestedFieldsSerializer
83
+ resource_name = 'authors'
84
+
85
+
52
86
def render_dummy_test_serialized_view (view_class , instance ):
53
87
serializer = view_class .serializer_class (instance = instance )
54
88
renderer = JSONRenderer ()
@@ -138,3 +172,57 @@ def test_extract_relation_instance(comment):
138
172
field = serializer .fields ['blog' ], resource_instance = comment
139
173
)
140
174
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 = '[email protected] ' )
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
+
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