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

Hel*_*lmi 2 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')
Run Code Online (Sandbox Code Playgroud)

使用此视图可以正常工作

class EpisodeViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')
    serializer_class = EpisodeSerializer
Run Code Online (Sandbox Code Playgroud)

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

router.register(r'episodes', views.EpisodeViewSet)
router.register(r'episode', views.EpisodeDetailViewSet)
Run Code Online (Sandbox Code Playgroud)

添加了这条路线并创建了一个新视图

class EpisodeDetailViewSet(viewsets.ModelViewSet):
    queryset = Episode.objects.all().order_by('-published_at')
    serializer_class = EpisodeDetailSerializer
Run Code Online (Sandbox Code Playgroud)

以及使用附加模型的序列化程序以获取更多详细信息

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
Run Code Online (Sandbox Code Playgroud)

现在这基本上适用于现在使用该/episode/123格式的每个剧集,但它还会在/episodeURL下呈现所有剧集的完整详细信息,并覆盖不再显示在 API 索引页面上的 /episodes URL。

我认为这是由于model = Episode条目覆盖了负责该模型的另一个类?

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

感谢您的任何建议。

nev*_*ner 5

我建议使用简单get_serializer_classEpisodeViewSet. 使用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
Run Code Online (Sandbox Code Playgroud)

现在您不需要EpisodeDetailViewSet并且urls.py您将只有一个 routnig:

router.register(r'episodes', views.EpisodeViewSet)
Run Code Online (Sandbox Code Playgroud)