Django 如何实现嵌套模型/管线?

Django 如何实现嵌套模型/管线?,django,django-rest-framework,Django,Django Rest Framework,我有一个播放列表模型和一个曲目模型 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="tr

我有一个播放列表模型和一个曲目模型

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)
以及序列化程序:

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")
如何创建视图(最好使用视图集),以便在
playlists/
中列出播放列表的曲目,并在同一url中创建曲目

当我转到上面的url时,我当前收到了
非字段错误


找不到关于如何在文档上执行这些嵌套视图的详细信息。谢谢。

您可以使用
drf嵌套路由器

下面代码中唯一有趣的部分是在
TrackViewSet
pre_save
方法中设置曲目播放列表

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
url.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)),
)