如何使用Django Rest Framework为列表和详细视图设置不同的Serializer? [英] How do I set different Serializer for list and detail view with Django Rest Framework?

查看:434
本文介绍了如何使用Django Rest Framework为列表和详细视图设置不同的Serializer?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在使用 viewsets.ModelViewSet HyperlinkedSerializer 时,如何为列表和详细信息视图设置不同的Serializer? / p>

通过定义列表,我看到如何使用 viewsets.ViewSet $ c>和 retrive ,(这里是一个例子),但我不知道如何优雅地适应 viewsets.ModelViewSet

解决方案

我已经从 Django休息框架,在同一个ModelViewSet中使用不同的序列化程序,这对我来说非常好,我希望你会发现有用的:

 类MyModelViewSet(viewsets.MyModelViewSet):

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

def get_serializer_class(s​​elf):
如果self.action =='retrieve':
如果hasattr(self,'detail_serializer_class'):
return self.detail_serializer_class

返回超级(MyModelViewSet,self).get_serializer_class()

在这种情况下,您只需指定两个序列化程序,并根据操作使用一个。但是,对于所有的操作,这可以被更一般地(如下所示):

  MyModelViewSet(viewsets.MyModelViewSet):

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

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

def get_serializer_class(s​​elf):

如果hasattr(self,'action_serializers'):
如果self.action_serializers中的self.action:
返回self.action_serializers [self.action]

返回超级(MyModelViewSet,self).get_serializer_class()


How do I set a different Serializer for list and detail view while using viewsets.ModelViewSet and HyperlinkedSerializer?

I see how to do it with viewsets.ViewSet by defining list and retrive, (here's an example) but I don't know how to elegantly adapt it to viewsets.ModelViewSet

解决方案

I've adapted an answer from "Django rest framework, use different serializers in the same ModelViewSet" that serves me very well, and I hope you'll find useful:

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()

In this case, you're just specifying your two serializers and using the one depending on the action. However, this can be made more general (for all actions) as follows:

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()

这篇关于如何使用Django Rest Framework为列表和详细视图设置不同的Serializer?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆