drf序列化组件

restful规范:前后端分离:前端一个项目,后端一个项目

1:通常使用HTTPS协议

2.域名部署 api.baidu.com     www.baidu.com/api

3.版本    www.baidu.com/api/v2  版本号放在请求头中

4.路径都是名词(可以用复数)

5.根据不同的请求方式,执行不同的操作  delete删除

put和patch操作都是幂等性操作

6.请求地址中携带过滤条件

7.状态码   {'status':100,error:'请勿接地气',data:[]}

8.错误信息

9.响应的数据格式:

  所有数据:列表

  删除数据:返回一个空

10.返回的数据中携带连接

CBV执行流程

路由中配置  类名.as_view()  本质是一个返回的函数地址

当有请求时:内存地址(request,其他参)

内部又调用的dispatch方法,通过反射,根据请求方式,执行不同方法

序列化组件

写一个类继承Serializer 在类中写要序列化的字段

如name = serializers.CharField()

在View.py中使用book=BookSerializer(book_list,many=True)(调用类进行序列化,序列化格式按照序列化类中字段指定的结果)

book.data 就是序列化后的数据

source的三种用法:1指定字段 2:指定方法 3:深度查询(跨表)

SerializerMethodField,必须配合方法使用get_字段名(self,obj)obj是当前序列化的对象(应该是利用反射)

SerializerMethodField对应的方法中还可以继续使用其他的序列化类

3:rest-framework序列化之ModelSerializer

写一个类继承ModelSerializer  在类内部写:

class Meta:

  model = models.Book

  fields='__all__'  所有字段

  exclude=['name',]  除什么字段之外

  depth=1  depth表示深度

  重写属性

 def validate_name(self,value):

if value.startswith('sb'):
#不能让你过
raise ValidationError('书名不能以sb开头')
else:
return value

#全局钩子函数,对全局字段进行校验
# def validate(self,a):
# # print(a)
# name=a.get('name')
# price=a.get('price')
# if name != price:
# raise ValidationError('错了')
# else:
# return a

校验数据在序列化类中校验

序列化单条数据

book_ser=BookSerializer(instance=book,many=False)

注意book:不是queryset对象,是book对象

5新增一本书

/books/发送post请求,携带json格式数据

6.反序列化之局部,全局钩子(序列化的类一定是继承ModelSerializer的类)

def validate_name(self,value):

  if value.startswith('sb'):

    raise ValidationError('书名不能以sb开头')

  else:

    return value

全局钩子函数,对全局字段进行校验

def validate(self,a):

  name = a.get('name')

  price=a.get('price')

  if name !=price:

    raise VilidationError('错了)

  else:

    return a

json在线格式化:https//www.json.cn/

原文地址:https://www.cnblogs.com/suncunxu/p/10600451.html