如何使用Django Rest Framework为列表和详细信息视图设置不同的Serializer?

and*_*abs 16 django django-rest-framework

在使用viewsets.ModelViewSet和时,HyperlinkedSerializer如何为列表和详细信息视图设置不同的序列化程序 ?

我看到如何viewsets.ViewSet通过定义listretrive(这是一个例子)来做到这一点,但我不知道如何优雅地适应它viewsets.ModelViewSet

bbe*_*ort 39

我已经改编了" Django rest框架,在同一个ModelViewSet中使用不同的序列化器 " 的答案,这对我很有用,我希望你会发现有用的:

class MyModelViewSet(viewsets.MyModelViewSet):

    queryset = MyModel.objects.all()
    serializer_class = MyModelListSerializer
    detail_serializer_class = MyModelDetailSerializer

    def get_serializer_class(self):
        if self.action == 'retrieve':
            if hasattr(self, 'detail_serializer_class'):
                return self.detail_serializer_class

        return super(MyModelViewSet, self).get_serializer_class()
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您只需指定两个序列化程序并使用一个序列化程序,具体取决于操作.但是,这可以更加通用(对于所有操作)如下:

class MyModelViewSet(viewsets.MyModelViewSet):

    queryset = MyModel.objects.all()
    serializer_class = MyModelSerializer

    action_serializers = {
        'retrieve': MyModelDetailSerializer,
        'list': MyModelListSerializer,
        'create': MyModelCreateSerializer
    }

    def get_serializer_class(self):

        if hasattr(self, 'action_serializers'):
            if self.action in self.action_serializers:
                return self.action_serializers[self.action]

        return super(MyModelViewSet, self).get_serializer_class()
Run Code Online (Sandbox Code Playgroud)