Django Rest Framework列表和详细视图重叠

时间:2018-04-29 12:19:51

标签: python django django-rest-framework

我的API将列出一组播客的剧集。列表本身应该被删除,并且没有足够小的数据来一次拉出整个列表。这是我的DRF序列化程序类

class EpisodeSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Episode
        fields = ('url', 'id', 'title', 'subtitle', 'show_id', 'published_at', 'updated_at')

使用此视图

可以正常工作
class EpisodeViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')
    serializer_class = EpisodeSerializer

`HyperlinkedModelSerializer'还将剧集链接到他们自己的详细视图,但显然默认使用相同的视图。现在我想要的是在细节视图上更详细,所以我做的是:

router.register(r'episodes', views.EpisodeViewSet)
router.register(r'episode', views.EpisodeDetailViewSet)

添加了此路线并制作了新视图

class EpisodeDetailViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')
    serializer_class = EpisodeDetailSerializer

和序列化程序使用其他模型获取更多详细信息

class EpisodeDetailSerializer(serializers.ModelSerializer):
    chapters = ChapterMarkSerializer(source='chaptermark_set', many=True)
    media = MediaClipSerializer(source='mediaclip_set', many=True)
    show = ShowSerializer()

    class Meta:
        model = Episode
        fields = ('url', 'id', 'title', 'subtitle', 'show', 'published_at', 'updated_at','description', 'show_notes', 'cover_image', 'updated_at', 'chapters', 'media')
        depth = 1

现在这基本上适用于每个剧集现在使用/episode/123格式,但它也会在/episode网址下呈现包含完整详细信息的所有剧集,并且它会覆盖不会显示的/剧集网址在API的索引页面上。

我认为由于model = Episode条目会覆盖另一个类以负责该模型?

我认为我的新视图需要被限制为不列出所有剧集,然后两个视图/序列化器需要以某种方式共存,但我觉得我被困在这里并且文档真的没有帮助我。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:2)

我建议使用get_serializer_class的简单覆盖EpisodeViewSet,而不是额外的视图集(可能会使代码更难以维护)。使用self.action属性,您可以检查当前操作并使用另一个序列化程序进行详细响应:

class EpisodeViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')

    def get_serializer_class(self):
        if self.action == 'retrieve':
            return EpisodeDetailSerializer
        return EpisodeSerializer

现在你不需要EpisodeDetailViewSet而在urls.py你将只有一个例程:

router.register(r'episodes', views.EpisodeViewSet)