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
!! 默认生成的路由都是带参数的!!
转载于:https://www.cnblogs.com/xxy614899502/p/10103722.html