APIView和View区别 -- APIView继承了View -- 豁免csrf -- 封装了request 用Request -- _request是旧的request -- request.query_params == _request.GET -- request.data == _request.POST _request.FIles 序列化组件 序列化 -- 声明一个序列化器 类比我们的model class BookSerializer(serializers.Serializer): id = serializers.IntegerField(required=False) title = serializers.CharField(max_length=32) pub_time = serializers.DateField() -- 序列化我们的queryset ser_obj = BookSerializer(queryset, many=True) return Response(ser_obj.data) 反序列化 POST请求 -- 序列化器 正序以及反序字段类型不统一的情况 required = False read_only = True write_only = True 写create方法 -- 视图 ser_obj = BookSerializer(data=request.data) if ser_obj.is_valid(): # 校验通过的数据在ser_obj.validated_data ser_obj.save() return Response(ser_obj.data) return Response(ser_obj.errors)今日内容 restfull规范 序列化组件 验证 ModelSerializer 视图的封装内容详细 restfull规范 REST风格 表述性状态转移 web交互方案 资源 在web中只要有被引用的必要都是资源 URI URI 统一资源标识符 URL 统一资源定位符 统一资源接口 根据HTTP请求方式的不同对资源进行不同的操作 遵循HTTP请求方式的语义 前后端传输的叫资源的表述 前端展现的叫资源的状态 通过超链接的指引告诉用户接下来有哪些资源状态可以进入 restfull规范 核心思想 -- 面向资源去编程 每个url就是资源的体现 尽量用名词不要用动词 -- 根据HTTP请求方式的不同对资源进行不同的操作 URL体现 -- 版本 https://v3.bootcss.com https://bootcss.com/v3 -- 体现是否是API https://v3.bootcss.com/api -- 过滤信息 https://v3.bootcss.com?page=1 -- 尽量用HTTPS 返回值体现 -- 携带状态码 -- 携带错误信息 -- 返回值 get 返回查看的所有或者单条信息 post 返回新增的那条数据 put/patch 返回更新那条数据 delete 返回空 -- 携带超链接 序列化组件 验证 单个字段校验 2222222 def validate_xxxxx(self, value): raise serializers.ValidationError("xxxxx") return value 多个字段 3333333 def validate(self, attrs): attrs 前端传过来的所有的数据组成的字典 raise serializers.ValidationError("xxxxx") return attrs 自定义 !!!!!!111111 def my_validate(value): raise serializers.ValidationError("xxxxx") return value title = serializers.CharField(max_length=32, validators=[my_validate, ]) ModelSerializer 帮我们写了create以及update方法 -- class BookSerializer(serializers.ModelSerializer): class meta: model= 对应的模型对象 fields = "__all__"/ ["", ""] exclude = [""] 排除某些字段 depth = 1 根据你的外键关系找几层 # 会让你所有的外键变成read_only = True extra_kwargs = { "字段名称": {参数} } -- SerializerMethodField 方法字段 会将钩子方法的返回值给字段 def get_字段名称(self, obj): obj 是我们循环序列化的每个模型对象 return 自己想要的数据 Response 携带HTTP标准状态码 做模板的渲染 视图组件 -- 第一次封装 class GenericAPIView(APIView): query_set = None serializer_class = None def get_queryset(self): return self.query_set def get_serializer(self, *args, **kwargs): return self.serializer_class(*args, **kwargs) class ListModelMixin(object): def list(self, request): queryset = self.get_queryset() ser_obj = self.get_serializer(queryset, many=True) return Response(ser_obj.data) class BookView(GenericAPIView, ListModelMixin): query_set = Book.objects.all() serializer_class = BookSerializer def get(self, request): return self.list(request) -- 第二次封装 为了方便继承 -- 第三次 ViewSetMixin -- 重写了as_view() -- 路由可以传参 for method, action in actions.items(): # method == 请求方式 get # action == list handler = getattr(self, action) # handler = 自己的视图类.list # handler 就是我们封装的list方法 setattr(self, method, handler) # 自己的视图类.get = 我们自己封装的list方法 # 在执行dispatch方法分发之前 self.get = self.list return self.dispatch(request, *args, **kwargs) class BookModelView(ModelViewSet): query_set = Book.objects.all() serializer_class = BookSerializer 路由组件 -- 导入 from rest_framwork.routers import DefaultRouter -- 实例化 router = DefaultRouter() -- 注册 router.register("list", BookModelView) -- 把默认生成的路由注册 urlpatterns += router.urls !! 默认生成的路由都是带参数的!!