Skip to content

Commit 16d4fa5

Browse files
committed
Working on relationships views
1 parent ba985ef commit 16d4fa5

File tree

4 files changed

+31
-12
lines changed

4 files changed

+31
-12
lines changed

example/tests/test_views.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.utils import timezone
2+
from rest_framework.reverse import reverse
23
from rest_framework.test import APITestCase
34

45
from rest_framework_json_api.utils import format_relation_name
@@ -8,7 +9,6 @@
89

910

1011
class TestRelationshipView(APITestCase):
11-
1212
def setUp(self):
1313
self.blog = Blog.objects.create(name='Some Blog', tagline="It's a blog")
1414
self.entry = Entry.objects.create(
@@ -23,7 +23,8 @@ def setUp(self):
2323
)
2424

2525
def test_get_entry_relationship_blog(self):
26-
response = self.client.get('/entries/{}/relationships/blog'.format(self.entry.id))
26+
url = reverse('entry-relationships', kwargs={'pk': self.entry.id, 'related_field': 'blog'})
27+
response = self.client.get(url)
2728
expected_data = {'type': format_relation_name('Blog'), 'id': str(self.entry.blog.id)}
2829

2930
assert response.data == expected_data

example/urls.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
from django.conf.urls import include, url
22
from rest_framework import routers
33

4-
from example.views import BlogViewSet, EntryViewSet, AuthorViewSet, EntryRelationshipView, BlogRelationshipView
5-
4+
from example.views import BlogViewSet, EntryViewSet, AuthorViewSet
65

76
router = routers.DefaultRouter(trailing_slash=False)
87

@@ -12,8 +11,4 @@
1211

1312
urlpatterns = [
1413
url(r'^', include(router.urls)),
15-
16-
url(r'^entries/(?P<pk>[^/.]+)/relationships/(?P<related_field>\w+)', EntryRelationshipView.as_view()),
17-
url(r'^blogs/(?P<pk>[^/.]+)/relationships/(?P<related_field>\w+)', BlogRelationshipView.as_view())
18-
1914
]

example/urls_test.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from django.conf.urls import include, url
22
from rest_framework import routers
33

4-
from example.views import BlogViewSet, EntryViewSet, AuthorViewSet
4+
from example.views import BlogViewSet, EntryViewSet, AuthorViewSet, EntryRelationshipView, BlogRelationshipView
55
from .api.resources.identity import Identity, GenericIdentity
66

77
router = routers.DefaultRouter(trailing_slash=False)
@@ -19,5 +19,13 @@
1919
# old tests
2020
url(r'identities/default/(?P<pk>\d+)',
2121
GenericIdentity.as_view(), name='user-default'),
22+
23+
24+
url(r'^entries/(?P<pk>[^/.]+)/relationships/(?P<related_field>\w+)',
25+
EntryRelationshipView.as_view(),
26+
name='entry-relationships'),
27+
url(r'^blogs/(?P<pk>[^/.]+)/relationships/(?P<related_field>\w+)',
28+
BlogRelationshipView.as_view(),
29+
name='blog-relationships'),
2230
]
2331

rest_framework_json_api/views.py

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,20 @@
1+
from django.db.models import Model, QuerySet
2+
from django.db.models.manager import BaseManager
13
from rest_framework import generics
24
from rest_framework.response import Response
5+
from rest_framework.renderers import JSONRenderer
36
from rest_framework_json_api.serializers import ResourceIdentifierObjectSerializer
47
from rest_framework.exceptions import NotFound
58

69

710
class RelationshipView(generics.GenericAPIView):
811
serializer_class = ResourceIdentifierObjectSerializer
12+
renderer_classes = (JSONRenderer, )
913

1014
def get(self, request, *args, **kwargs):
1115
related_instance = self.get_related_instance(kwargs)
12-
serializer_class = self.get_serializer_class()
13-
serializer = serializer_class(instance=related_instance)
14-
return Response(serializer.data)
16+
serializer_instance = self.instantiate_serializer(related_instance)
17+
return Response(serializer_instance.data)
1518

1619
def put(self, request, *args, **kwargs):
1720
return Response()
@@ -30,3 +33,15 @@ def get_related_instance(self, kwargs):
3033
return getattr(self.get_object(), kwargs['related_field'])
3134
except AttributeError:
3235
raise NotFound
36+
37+
def instantiate_serializer(self, instance):
38+
serializer_class = self.get_serializer_class()
39+
if isinstance(instance, Model):
40+
return serializer_class(instance=instance)
41+
else:
42+
if isinstance(instance, (QuerySet, BaseManager)):
43+
instance = instance.all()
44+
45+
return serializer_class(instance=instance, many=True)
46+
47+

0 commit comments

Comments
 (0)