How to implement nested models / routes?

I have a playlist model and a track model.

class Playlist(models.Model): created = models.DateTimeField(auto_now_add=True) user = models.ForeignKey(User, related_name="playlists") class Track(models.Model): playlist = models.ForeignKey(Playlist, related_name="tracks") track_id = models.CharField(max_length=50) 

And serializers:

 class TrackSerializer(serializers.ModelSerializer): class Meta: model = Track fields = ("id", "track_id") class PlaylistSerializer(serializers.ModelSerializer): user = serializers.Field(source="user.username") tracks = TrackSerializer(many=True) class Meta: model = Playlist fields = ("id", "created", "user", "tracks") 

How do I get into creating views (preferably using views) that let me list the tracks on the playlist in playlists/<playlist_id> , as well as create tracks with the same address?

I am currently getting non_field_errors when I go to the above URL.

Could not find much information on how to do these subviews in documents. Thanks.

+1
django django-rest-framework
source share
1 answer

You can use drf-nested-routers ( https://github.com/alanjds/drf-nested-routers ).

The only interesting part in the code below is setting the track playlist in the pre_save TrackViewSet method.

views.py

 class TrackViewSet(viewsets.ModelViewSet): queryset = Track.objects.all() serializer_class = TrackSerializer def pre_save(self, obj): obj.playlist = Playlist.objects.get(pk=self.kwargs['playlist_pk']) class PlaylistViewSet(viewsets.ModelViewSet): queryset = Playlist.objects.all() serializer_class = PlaylistSerializer def pre_save(self, obj): obj.user = self.request.user 

urls.py

 from django.conf.urls import patterns, url, include from rest_framework_nested import routers from . import views router = routers.SimpleRouter() router.register(r'playlists', views.PlaylistViewSet) playlists_router = routers.NestedSimpleRouter(router, r'playlists', lookup='playlist') playlists_router.register(r'tracks', views.TrackViewSet) urlpatterns = patterns('', url(r'^', include(router.urls)), url(r'^', include(playlists_router.urls)), ) 
+2
source share

All Articles