【问题标题】:Django Rest Framework list and detail view overlapDjango Rest Framework 列表和详细视图重叠
【发布时间】:2018-10-09 17:18:22
【问题描述】:

我的 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 URL 下呈现所有剧集的完整详细信息,并覆盖不再显示在 API 索引页面上的 /episodes URL .

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

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

感谢您的建议。

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    我建议简单地覆盖 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
    

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

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

    【讨论】:

    • 在实现get_serializer_class() 时,serializer_class 不是多余的吗?
    猜你喜欢
    • 2020-05-27
    • 2016-04-25
    • 2020-12-18
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多