serialization - Using HyperlinkedField for serializer in Django Rest Framework -


all,

i having trouble making 1 of model's relational fields show hyperlink in django rest framework. (i working off of examples provided @ http://www.django-rest-framework.org/api-guide/relations/.) here code:

models.py:

class album(models.model):     album_name = models.charfield(max_length=100)     artist = models.charfield(max_length=100)  class track(models.model):     album = models.foreignkey(album, related_name='tracks')     order = models.integerfield()     title = models.charfield(max_length=100)     duration = models.integerfield()      class meta:         unique_together = ('album', 'order')         ordering = ['order']      def __unicode__(self):         return '%d: %s' % (self.order, self.title) 

serializers.py:

class albumserializer(serializers.modelserializer):     tracks = serializers.stringrelatedfield(many=true)      class meta:         model = album         fields = ('album_name', 'artist', 'tracks')  class trackserializer(serializers.modelserializer):     # works...     # album = serializers.slugrelatedfield(slug_field="album_name", read_only=true)     # not work...     album = serializers.hyperlinkedrelatedfield(view_name="album-detail", read_only=true)      class meta:         model = track         fields = ('album', 'order', 'title', 'duration') 

views.py:

@api_view(('get',)) def api_root(request, format=none):     return response({         'albums': reverse("album-list", request=request, format=format),         'tracks': reverse("track-list", request=request, format=format),     })  class albumlist(apiview):      def get(self, request, format=none):         albums = album.objects.all()         serializer = albumserializer(albums, many=true)         return response(serializer.data)      def post(self, request, format=none):         album = albumserializer(data=request.data)         if album.is_valid():             album.save()             return response(album.data, status=status.http_201_created)         else:             return response(album.errors, status=status.http_400_bad_request)  class albumdetail(apiview):      def get_object(self, pk):         try:             return album.objects.get(pk=pk)         except album.doesnotexist:             raise http404      def get(self, request, pk, format=none):         album = self.get_object(pk)         serializer = albumserializer(album)         return response(serializer.data)      def put(self, request, pk, format=none):         album = self.get_object(pk)         serializer = albumserializer(album, data=request.data)         if serializer.is_valid():             serializer.save()             return response(serializer.data)         return response(serializer.errors, status=status.http_400_bad_request)      def delete(self, request, pk, format=none):         album = self.get_object(pk)         album.delete()         return response(status=status.http_204_no_content)  class tracklist(apiview):     def get(self, request, format=none):         tracks = track.objects.all()         serializer = trackserializer(tracks, many=true)         return response(serializer.data)      def post(self, request, format=none):         track = trackserializer(data=request.data)         if track.is_valid():             track.save()             return response(track.data, status=status.http_201_created)         else:             return response(track.errors, status=status.http_400_bad_request)  class trackdetail(apiview):     def get_object(self, pk):         try:             return track.objects.get(pk=pk)         except track.doesnotexist:             raise http404      def get(self, request, pk, format=none):         track = self.get_object(pk)         serializer = trackserializer(track)         return response(serializer.data)      def put(self, request, pk, format=none):         track = self.get_object(pk)         serializer = trackserializer(track, data=request.data)         if serializer.is_valid():             serializer.save()             return response(serializer.data)         return response(serializer.errors, status=status.http_400_bad_request)      def delete(self, request, pk, format=none):         track = self.get_object(pk)         track.delete()         return response(status=status.http_204_no_content) 

urls.py:

urlpatterns = patterns('',     url(r'^api/$', api_root),     url(r'^api/albums/$', albumlist.as_view(), name="album-list"),     url(r'^api/albums/(?p<pk>[0-9]+)/$', albumdetail.as_view(), name="album-detail"),     url(r'^api/tracks/$', tracklist.as_view(), name="track-list"),     url(r'^api/tracks/(?p<pk>[0-9]+)/$', trackdetail.as_view(), name="track-detail"),  )  urlpatterns = format_suffix_patterns(urlpatterns) 

when use slugrelatedfield in trackserializer, works expected. when use hyperlinkedrelatedfield, following error:

assertionerror @ /api/tracks/

hyperlinkedrelatedfield requires request in serializer context. add context={'request': request} when instantiating serializer.

any thoughts?

as @zymud said, should change serializer serializer = albumserializer(album, context={'request': request}) in albumlist , albumdetail views


Comments