Django Rest框架列表和细节视图重叠

2024-06-06 11:53:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我的API将列出一组播客的片段。列表本身应该被剥离,不能有太多的数据小到可以一次将整个列表拉出来。这是我的DRF序列化程序类

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

使用此视图可以很好地工作

^{pr2}$

“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格式的每一集,但是它也在/episodeURL下呈现所有的剧集,并且它覆盖了不再显示在API索引页上的/集URL。在

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

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

谢谢你的建议。在


Tags: 程序视图apiid列表model序列化show
1条回答
网友
1楼 · 发布于 2024-06-06 11:53:45

我建议简单地重写get_serializer_classEpisodeViewSet,而不是附加的viewset(这可能使代码的维护更加复杂)。使用^{}属性,您可以检查当前操作并仅使用另一个序列化程序获取详细响应:

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中,您将只有一个路径:

^{pr2}$

相关问题 更多 >