- 当viewset中,多个action对应了不一样的serializers的时候
class UserView(viewsets.GenericViewSet):
queryset = User.objects.all()
serializer_class = UserSeriallers
def get_serializer_class(self):
if self.action in ['collection', ]:
return Serializers1
elif self.action in ['orderhouse', ]:
return Seriallers2
elif self.action in ['disperson', ]:
return Serializers3
return self.serializer_class
- 当viewset中,多个action对应不一样的permission
class AdviserView(viewsets.GenericViewSet):
queryset = Adviser.objects.all().order_by("-id")
serializer_class = AdviserSerializers
permission_classes = (AdviserPermission, )
def get_permissions(self):
if self.action in ["small_app_login", "decode_data",
"bind_phone"]:
self.permission_classes = ()
return super().get_permissions()
- 若是不习惯class view的方式可使用@api_view装饰器,对应的权限等class能够经过对应的装饰器添加
- serializer中,使用SerializerMethodField,若是须要使用request的数据,能够经过
self.context['request']
取出来,一样的,若是serializer中须要将request传到context, 使用serializers的时候 须要serializer = Serializer(qs, many=True, context={ 'request': request})
的方式传入context
- 当列表的serializer和详情的serializer的字段不一样时,可使用继承的方式,减小代码量