序列化器-Serializer
作用:
1. 序列化,序列化器会把模型对象转成字典,经过response以后变成json字符串
2. 反序列化,把客户端发送过来的数据,经过request以后变成字典,序列化器可以把字典转成模型
3. 反序列化,完成数据校验功能
Serializer序列化
# 声明序列化器
from rest_framwork import serializer
# 所有的自定义序列化器必须直接或间接继承于 serializers.serializer
"""
在drf中,对于客户端提交的数据,往往需要验证数据的有效性,准确性。这部分代码写在序列化器中的。
在序列化器中,已提供三个地方给我们针对客户端提交的数据进行验证。
1. [内置选项] 字段声明的小圆括号中,已选项存在作为校验
2. [自定义方法] 在序列化器中作为对象方法来提供验证[这部分验证的方法,必须以"validate_<字段>" 或者 "validate" 作为方法名]
3. [自定义函数] 在序列化器外部,提前声明一个验证代码,然后在字段声明的小圆括号中,通过"validators=[验证函数1,验证函数2....]"
"""
# 自定义验证函数
def check_name(data):
if data == "luffy":
raise serializers.ValidationError("用户名不能是luffy")
return data
class productsSerializer(serializers.Serializer):
# 1.声明字段【要转换的字段, 当然,如果写了第二部分代码,有时候也可以不声明】
name = serializers.CharField(max_lenght=100, validators=[check_name])
# 2.可选【如果序列化器继承的是ModelSerializer,则需要声明对应的模型和字段】
# 3.可选 【用于对客户端提交的数据进行验证】
"""验证单个字段的数据"""
def validate_name(self, data):
if data == "root":
raise serializers.ValidationError("当前字段不能叫root")
# 验证方法中结束时必须返回本次验证的内容
return data
"""验证多个字段的数据"""
def validate(self, data_dict) # 表示客户端提交的所有数据
# 从数据中提取要验证的字段
name = data_dict.get("name")
if name="aaa":
raise serializers.ValidationError("该名称不可使用")
return data_dict
# 4.可选 【用于把通过验证的数据进行数据库操作,保存到数据库】
"""
在完成数据验证以后,drf提供了request和response来接收和返回数据。
1. create
2. update
"""
def create(self,validate):
"""接收客户端提交的新增数据"""
name = validate.get("name")
age = validate.get("age")
instance = 模型.object.create(name=name,age=age)
return instance
def update(self,instance,validated_data):
"""用户在反序列化中对于验证完成的数据进行保存更新"""
name = validate.get("name")
age = validate.get("age")
instance.name = name
instance.age = age
instance.save()
return instance
view视图
# 使用序列化器进行数据的序列化操作
# 序列化转换一条数据;模型转换成字典
class productsView(view):
def get(self, request, pk):
# 1.接收客户端的参数
products = Products.object.get(pk=pk)
# 2. 转换数据格式 实例化序列化器类
# productsSerializer(模型对象或者模型列表,客户端提交的数据,额外要传递到序列化器中使用的数据)
serializer = productsSerializer(instance=products)
# 3. 获取序列化器转换的结果
data = serializer.data
def getlist(self, request):
products_list = Products.object.all()
# 序列化器转换多个数据
# many = true 表示本次序列化器转换如果有多个模型对象列参数,必须声明Many=True
serializer = productsSerializer(products_list, many_True)
def post(self,request):
# 拿到数据字符串
data = request.body.decode()
# 把数据转成字典
import json
data_dict = json.loads(data)
# 客户端提交数据时,对数据进行校验
serializer = productsSerializer(data=data_dict)
# 调用序列化器进行实例化
# is_valid 在执行的时候,会自动先后调用;字段的内置选项-->自定义的验证方法-->自定义验证函数
# 调用序列化器中写好的验证代码
# raise_exception=True 抛出验证错误信息,并阻止代码继续往后运行
serializer.is_valid(raise_exception=True)
# save表示让序列化器开始执行反序列代码。 也就是执行create和update代码
serializer.save()
# 获取验证的错误信息
print("错误信息:%s"%serializer.error_messages)
# 获取被验证后的客户端数据
print("验证后的数据:%S"% serializer.validated_data )
return HttpResponse("ok")
def put(self,request,pk):
"""在更新中调用序列化器完成数据的更新操作"""
date = 模型.objects.get(pk=pk);
# 用户提交的数据
date_dict = {}
# 实例化序列化器
productsSerializer(instance=date, data=date_dict)
serializer.is_valid(raise_exception=True)
instance = serializer.save()
return HttpReponse("ok")