Skip to content

Commit a04c82d

Browse files
committed
Added new serializers for BLogs to test default serializer behaviour in request response cycle
1 parent b42b20b commit a04c82d

File tree

4 files changed

+75
-4
lines changed

4 files changed

+75
-4
lines changed

example/serializers.py

+27
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from packaging import version
55

66
from rest_framework_json_api import relations, serializers
7+
from rest_framework import serializers as drf_serilazers
78

89
from example.models import (
910
ArtProject,
@@ -27,6 +28,13 @@ class Meta:
2728
fields = ('tag',)
2829

2930

31+
# DRF default serializer to test default DRF functionalities
32+
class TaggedItemDRFSerializer(drf_serilazers.ModelSerializer):
33+
class Meta:
34+
model = TaggedItem
35+
fields = ('tag',)
36+
37+
3038
class BlogSerializer(serializers.ModelSerializer):
3139
copyright = serializers.SerializerMethodField()
3240
tags = TaggedItemSerializer(many=True, read_only=True)
@@ -50,6 +58,25 @@ class Meta:
5058
meta_fields = ('copyright',)
5159

5260

61+
# DRF default serializer to test default DRF functionalities
62+
class BlogDRFSerializer(serializers.ModelSerializer):
63+
copyright = serializers.SerializerMethodField()
64+
tags = TaggedItemSerializer(many=True, read_only=True)
65+
66+
def get_copyright(self, resource):
67+
return datetime.now().year
68+
69+
def get_root_meta(self, resource, many):
70+
return {
71+
'api_docs': '/docs/api/blogs'
72+
}
73+
74+
class Meta:
75+
model = Blog
76+
fields = ('name', 'url', 'tags')
77+
read_only_fields = ('tags',)
78+
79+
5380
class EntrySerializer(serializers.ModelSerializer):
5481
def __init__(self, *args, **kwargs):
5582
super(EntrySerializer, self).__init__(*args, **kwargs)

example/tests/unit/test_default_drf_serializers.py

+24
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import json
22

3+
from django.urls import reverse
34
from rest_framework.serializers import ModelSerializer, SerializerMethodField
45
from rest_framework import viewsets
56

7+
from example.tests.test_views import TestBlogViewSet
68
from rest_framework_json_api.renderers import JSONRenderer
79

810
from example.models import Comment, Entry
@@ -46,6 +48,7 @@ def render_dummy_test_serialized_view(view_class):
4648
renderer_context={'view': view_class()})
4749

4850

51+
# tests
4952
def test_simple_reverse_relation_included_renderer():
5053
"""
5154
Test renderer when a single reverse fk relation is passed.
@@ -73,3 +76,24 @@ def test_render_format_keys(settings):
7376

7477
result = json.loads(rendered.decode())
7578
assert result['data']['attributes']['json-field'] == {'json-key': 'JsonValue'}
79+
80+
81+
class TestDRFBlogViewSet(TestBlogViewSet):
82+
83+
def test_get_object_gives_correct_blog(self):
84+
url = reverse('drf-entry-blog', kwargs={'entry_pk': self.entry.id})
85+
resp = self.client.get(url)
86+
expected = {
87+
'data': {
88+
'attributes': {'name': self.blog.name},
89+
'id': '{}'.format(self.blog.id),
90+
'links': {'self': 'http://testserver/blogs/{}'.format(self.blog.id)},
91+
'meta': {'copyright': 2018},
92+
'relationships': {'tags': {'data': []}},
93+
'type': 'blogs'
94+
},
95+
'meta': {'apiDocs': '/docs/api/blogs'}
96+
}
97+
got = resp.json()
98+
print(got)
99+
self.assertEqual(got, expected)

example/urls_test.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,14 @@
1616
NoFiltersetEntryViewSet,
1717
NonPaginatedEntryViewSet,
1818
ProjectTypeViewset,
19-
ProjectViewset
20-
)
19+
ProjectViewset,
20+
DRFBlogViewSet)
2121

2222
router = routers.DefaultRouter(trailing_slash=False)
2323

2424
router.register(r'blogs', BlogViewSet)
25+
# router to test default DRF functionalities
26+
router.register(r'blogs', DRFBlogViewSet)
2527
router.register(r'entries', EntryViewSet)
2628
# these "flavors" of entries are used for various tests:
2729
router.register(r'nopage-entries', NonPaginatedEntryViewSet, 'nopage-entry')
@@ -48,6 +50,11 @@
4850
BlogViewSet.as_view({'get': 'retrieve'}),
4951
name='entry-blog'
5052
),
53+
# url to test default DRF functionalities
54+
url(r'^entries/(?P<entry_pk>[^/.]+)/blog',
55+
DRFBlogViewSet.as_view({'get': 'retrieve'}),
56+
name='drf-entry-blog'
57+
),
5158
url(r'^entries/(?P<entry_pk>[^/.]+)/comments',
5259
CommentViewSet.as_view({'get': 'list'}),
5360
name='entry-comments'

example/views.py

+15-2
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import rest_framework.parsers
33
import rest_framework.renderers
44
from rest_framework.filters import SearchFilter
5+
from rest_framework import viewsets
56

67
import rest_framework_json_api.metadata
78
import rest_framework_json_api.parsers
@@ -21,8 +22,8 @@
2122
CompanySerializer,
2223
EntrySerializer,
2324
ProjectSerializer,
24-
ProjectTypeSerializer
25-
)
25+
ProjectTypeSerializer,
26+
BlogDRFSerializer)
2627

2728
HTTP_422_UNPROCESSABLE_ENTITY = 422
2829

@@ -39,6 +40,18 @@ def get_object(self):
3940
return super(BlogViewSet, self).get_object()
4041

4142

43+
class DRFBlogViewSet(viewsets.ModelViewSet):
44+
queryset = Blog.objects.all()
45+
serializer_class = BlogDRFSerializer
46+
47+
def get_object(self):
48+
entry_pk = self.kwargs.get('entry_pk', None)
49+
if entry_pk is not None:
50+
return Entry.objects.get(id=entry_pk).blog
51+
52+
return super(DRFBlogViewSet, self).get_object()
53+
54+
4255
class JsonApiViewSet(ModelViewSet):
4356
"""
4457
This is an example on how to configure DRF-jsonapi from

0 commit comments

Comments
 (0)