根据需要定义好序列化器类以后,我们可以在视图中调用序列化器,实现输入数据的反序列化及输出数据的序列化
一般会有如下场景:
一、只涉及到输入数据的校验
a.创建序列化器类
b.创建序列化对象 序列化器类(data=字典)
c.调用序列化对象的is_valid()方法进行校验,raise_exception=True校验失败返回错误信息:序列化对象.is_valid(raise_exception=True)
d.校验失败,则获取错误信息:序列化对象.errors
e.校验成功,则获取校验成功之后的值:序列化对象.validated_data
ret = {
"msg": "",
"code": 0
}
class ProjectsView(View):
def post(self, request):
# a.获取新的项目信息并转化为python中数据类型(字典或者嵌套字典的列表)
request_data = request.body
try:
python_data = json.loads(request_data)
except Exception as e:
result = {
"msg": "参数有误",
"code": 0
}
return JsonResponse(result, status=400)
# b、创建序列化器对象
serializer_obj = ProjectsSerializer(data=python_data)
try:
# c.序列化器对象调用is_valid()方法,开始进行校验,如果不调用此方法,那么不会进行校验,如果校验成功,返回True,否则返回False
serializer_obj.is_valid(raise_exception=True)
except Exception as e:
ret['msg'] = '参数有误'
#d.必须调用is_valid()方法之后,才能使用.errors属性去获取报错信息,相当于一个字典
ret.update(serializer_obj.errors)
return JsonResponse(ret, status=400)
#e.必须调用is_valid()方法之后校验通过后,才能使用.validated_data属性去获取校验通过信息
ret.update(serializer_obj.validated_data)
return JsonResponse(ret, status=201)
二、如果仅仅获取数据库中的数据
a.创建序列化器类
b.创建序列化对象
- 序列化器类(instance=模型对象)
- 序列化器类(instance=查询集对象, many=True)
- 序列化器类(instance=普通对象)
c.序列化输出:序列化对象.data
class ProjectsView(View):
def get(self, request):
qs = Projects.objects.all()
qs1=Projects.objects.get(id=1)
serializer_obj = ProjectsSerializer(instance=qs, many=True)
serializer_obj1 = ProjectsSerializer(instance=qs)
return JsonResponse(serializer_obj.data, status=200, safe=False)
三、既需要做数据校验也需要修改数据库中的数据
a.创建序列化器类
b.创建序列化对象
- 序列化器类(instance=模型对象, data=字典)
- 序列化器类(data=字典)
c.开始进行校验:序列化对象.is_valid()
d.获取错误信息:序列化对象.errors
e.获取校验成功之后对数据进行修改
- 没有给instance传参:序列化对象.save() ->调用序列化器类的.create()方法
- 有给instance传参:序列化对象.save() -> 调用序列化器类的.update()方法
f.序列化输出:序列化对象.data
def put(self, request, pk):
ret = {
"msg": "",
"code": 0
}
obj = self.get_object(pk)
request_data = request.body
try:
python_data = json.loads(request_data)
except Exception as e:
result = {
"msg": "参数有误",
"code": 0
}
return JsonResponse(result, status=400)
# 如果在定义序列化器对象时,同时指定instance和data参数,调用序列化器对象.save()方法,会自动调用序列化器类中的update方法
serializer_obj = ProjectsModelSerializer(instance=obj, data=python_data)
serializer_obj1 = ProjectsModelSerializer( data=python_data)
try:
serializer_obj1.is_valid(raise_exception=True)
except Exception as e:
ret['msg'] = '参数有误'
ret.update(serializer_obj1.errors)
return JsonResponse(ret, status=400)
#会自动调用序列化器类中的update方法
serializer_obj.save()
#调用序列化器对象.save()方法
serializer_obj1.save()
return JsonResponse(serializer_obj1.data, status=201)
网友评论