|
# 2、 serializer序列化器如何使用
1、在ser.py文件中写一个类继承serializers.Serializer
2、在序列化类写想要的字段[根据需求写出所想要的字段]
3、导入到视图类中,要序列化器序列化得到一个对象,把要字段的序列化对象传到这里面序列化器对象中去
4、序列化.data 是一个字典还不是字符串,要传给前端就得使用JsonResponse传递,只是不会区分到底是谁来请求了,返回的都是统一的字符串格式了
5、用rest_frame的封装的Response返回,这样可以根据不同的user_agent返回不同的操作结果,比如postman请求返回的是字符传,浏览器请求返回一个可视化的界面
推荐使用rest_framework的,需要注意的是要在settings.py中注册一下 "rest_framework"
request和response 对比记忆
request.data 浏览器发来的POST请求
request.query_params 浏览器发来的GET请求
request._request 原生的Http的request的
# 3、序列化字段类型
有很多:很Django的ORM相对应,eg:CharField、IntegerField、DateField
# 4、序列化字段选项
如:max_length,min_length
# 5、鸭子类型回顾
[接口规范:]
子类只要有了父类的东西,那么父类的鸭子就不用了,利用ABC模块控制,子类必须写父类的东西,父类的东西就不要了
# 6、反序列具体用法
1 写一个序列化的类,继承Serializer
2 在类中写要反序列化的字段,想反序列化哪个字段,就在类中写哪个字段,字段的属性(max_lenth......)
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
trim_whitespace 是否截断空白字符
max_value 最小值
min_value 最大值
3 在视图类中使用,导入--》实例化得到序列化类的对象,把要要修改的对象传入,修改的数据传入
boo_ser=BookSerializer(book,request.data)
boo_ser=BookSerializer(instance=book,data=request.data)
4 数据校验 if boo_ser.is_valid()
5 如果校验通过,就保存
boo_ser.save() # 注意不是book.save()
6 如果不通过,逻辑自己写
7 如果字段的校验规则不够,可以写钩子函数(局部和全局)
# 局部钩子
def validate_price(self, data): # validate_字段名 接收一个参数
#如果价格小于10,就校验不通过
# print(type(data))
# print(data)
if float(data)>10:
return data
else:
#校验失败,抛异常
raise ValidationError('价格太低')
# 全局钩子
def validate(self, validate_data): # 全局钩子
print(validate_data)
author=validate_data.get('author')
publish=validate_data.get('publish')
if author == publish:
raise ValidationError('作者名字跟出版社一样')
else:
return validate_data
8 可以使用字段的author=serializers.CharField(validators=[check_author]) ,来校验
-写一个函数
def check_author(data):
if data.startswith('sb'):
raise ValidationError('作者名字不能以sb开头')
else:
return data
-配置:validators=[check_author]
|
-
|
|