diff --git a/example/serializers.py b/example/serializers.py index 1fee79c4..c52f575f 100644 --- a/example/serializers.py +++ b/example/serializers.py @@ -63,7 +63,7 @@ class BlogDRFSerializer(drf_serilazers.ModelSerializer): DRF default serializer to test default DRF functionalities """ copyright = serializers.SerializerMethodField() - tags = TaggedItemSerializer(many=True, read_only=True) + tags = TaggedItemDRFSerializer(many=True, read_only=True) def get_copyright(self, resource): return datetime.now().year @@ -173,6 +173,21 @@ class JSONAPIMeta: included_resources = ['comments'] +class EntryDRFSerializers(drf_serilazers.ModelSerializer): + + tags = TaggedItemDRFSerializer(many=True, read_only=True) + url = drf_serilazers.HyperlinkedIdentityField( + view_name='drf-entry-blog-detail', + lookup_url_kwarg='entry_pk', + read_only=True, + ) + + class Meta: + model = Entry + fields = ('tags', 'url',) + read_only_fields = ('tags',) + + class AuthorTypeSerializer(serializers.ModelSerializer): class Meta: model = AuthorType diff --git a/example/tests/unit/test_default_drf_serializers.py b/example/tests/unit/test_default_drf_serializers.py index d09d293f..e17b9a52 100644 --- a/example/tests/unit/test_default_drf_serializers.py +++ b/example/tests/unit/test_default_drf_serializers.py @@ -184,3 +184,45 @@ def test_get_object_deletes_correct_blog(client, entry): resp = client.delete(url) assert resp.status_code == 204 + + +@pytest.mark.django_db +def test_get_entry_list_with_blogs(client, entry): + url = reverse('drf-entry-suggested', kwargs={'entry_pk': entry.id}) + resp = client.get(url) + + got = resp.json() + + expected = { + 'links': { + 'first': 'http://testserver/drf-entries/1/suggested/?page=1', + 'last': 'http://testserver/drf-entries/1/suggested/?page=1', + 'next': None, + 'prev': None + }, + 'data': [ + { + 'type': 'entries', + 'id': '1', + 'attributes': {}, + 'relationships': { + 'tags': { + 'data': [] + } + }, + 'links': { + 'self': 'http://testserver/drf-blogs/1' + } + } + ], + 'meta': { + 'pagination': { + 'page': 1, + 'pages': 1, + 'count': 1 + } + } + } + + assert resp.status_code == 200 + assert got == expected diff --git a/example/urls_test.py b/example/urls_test.py index 2e7d2d64..e51121ac 100644 --- a/example/urls_test.py +++ b/example/urls_test.py @@ -11,6 +11,7 @@ CommentViewSet, CompanyViewset, DRFBlogViewSet, + DRFEntryViewSet, EntryRelationshipView, EntryViewSet, FiltersetEntryViewSet, @@ -23,7 +24,7 @@ router = routers.DefaultRouter(trailing_slash=False) router.register(r'blogs', BlogViewSet) -# router to test default DRF functionalities +# router to test default DRF blog functionalities router.register(r'drf-blogs', DRFBlogViewSet, 'drf-entry-blog') router.register(r'entries', EntryViewSet) # these "flavors" of entries are used for various tests: @@ -59,6 +60,10 @@ EntryViewSet.as_view({'get': 'list'}), name='entry-suggested' ), + url(r'^drf-entries/(?P[^/.]+)/suggested/', + DRFEntryViewSet.as_view({'get': 'list'}), + name='drf-entry-suggested' + ), url(r'entries/(?P[^/.]+)/authors', AuthorViewSet.as_view({'get': 'list'}), name='entry-authors'), diff --git a/example/views.py b/example/views.py index 78cdc6ad..41036fc6 100644 --- a/example/views.py +++ b/example/views.py @@ -21,6 +21,7 @@ BlogSerializer, CommentSerializer, CompanySerializer, + EntryDRFSerializers, EntrySerializer, ProjectSerializer, ProjectTypeSerializer @@ -104,6 +105,20 @@ def get_object(self): return super(EntryViewSet, self).get_object() +class DRFEntryViewSet(viewsets.ModelViewSet): + queryset = Entry.objects.all() + serializer_class = EntryDRFSerializers + lookup_url_kwarg = 'entry_pk' + + def get_object(self): + # Handle featured + entry_pk = self.kwargs.get(self.lookup_url_kwarg, None) + if entry_pk is not None: + return Entry.objects.exclude(pk=entry_pk).first() + + return super(DRFEntryViewSet, self).get_object() + + class NoPagination(PageNumberPagination): page_size = None