如何使用Django Rest Framework为列表和详细视图设置不同的Serializer? [英] How do I set different Serializer for list and detail view with Django Rest Framework?
问题描述
在使用 viewsets.ModelViewSet
和 HyperlinkedSerializer
时,如何为列表和详细信息视图设置不同的Serializer? / p>
通过定义列表$ c ,我看到如何使用
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(self):
如果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(self):
如果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屋!