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/
hyperlinkedrelatedfieldrequires request in serializer context. addcontext={'request': request}when instantiating serializer.
any thoughts?
as @zymud said, should change serializer serializer = albumserializer(album, context={'request': request}) in albumlist , albumdetail views
Comments
Post a Comment