企业网站建设实训小结,金融类网站源码,短视频seo关键词,海南平台网站建设企业上一章#xff1a;
二、Django REST Framework (DRF)序列化反序列化数据校验_做测试的喵酱的博客-CSDN博客
下一章#xff1a;
五、DRF 模型序列化器ModelSerializer_做测试的喵酱的博客-CSDN博客
一、背景
1、创建请求#xff0c;post#xff0c;用户输入…上一章
二、Django REST Framework (DRF)序列化反序列化数据校验_做测试的喵酱的博客-CSDN博客
下一章
五、DRF 模型序列化器ModelSerializer_做测试的喵酱的博客-CSDN博客
一、背景
1、创建请求post用户输入json数据就可以直接创建一条数据
2、更新请求put需要两类数据
用户传入的json数据具体需要更新的哪些字段。需要先去库里取出需要更新的实例再来对它更新。 我们现在的post 创建 与put更新请求。都是在views.py视图函数中利用ORM框架进行的数据库操作。
创建请求post # 创建班级def post(self,request):# 1、获取json参数并转化为python中的数据类型字典try:dic_data json.loads(request.body)except Exception as e:return JsonResponse({msg: 参数有误}, status400)# 获取反序列化的实例对象class_obj ClassSerializer(datadic_data)# 对数据进行校验# 校验不通过if not class_obj.is_valid():return JsonResponse(class_obj.errors, status400)# 创建数据执行saqlmiaoclass MiaoClass.objects.create(**class_obj.validated_data)# 对创建的数据进行数据回显序列化serializer ClassSerializer(instancemiaoclass)return JsonResponse(serializer.data, status201)
更新请求put def put(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj MiaoStudent.objects.get(idpk)except Exception as e:return JsonResponse({msg: 参数有误}, status400)# 3、获取json参数并转化为字典try:dic json.loads(request.body)except Exception as e:return JsonResponse({msg: 参数有误}, status400)# 4、序列化将 用户输入的字典转化为序列化实例serializer_objStudentSerializer(datadic)# 5、序列化器对用户传入的参数进行校验# is_valid() 数据校验# serializer_obj.errors 校验后报错信息if not serializer_obj.is_valid():return JsonResponse(serializer_obj.errors, status400)# 6、更新数据,操作数据库student_obj.sname serializer_obj.validated_data.get(sname)student_obj.sgender serializer_obj.validated_data.get(sgender)student_obj.sid serializer_obj.validated_data.get(sid)student_obj.sscore serializer_obj.validated_data.get(sscore)student_obj.classid_id serializer_obj.validated_data.get(classid_id)student_obj.save()# 7、数据回显示非必需的。将读取的项目数据转化为字典serializer StudentSerializer(instancestudent_obj)return JsonResponse(serializer.data, status201)二、序列化器create方法与update方法
上面处理 数据库操作是在views视图函数中进行的现在
将操作数据库的行为 封装到 序列化器类中。
post create创建操作通过序列化器create 方法实现
put update更新操作通过序列化器update方法实现。
2.1 序列化器create方法
原post 创建请求 class StudentsView(View):# 查询所有数据def get(self,request):# 获取列表数据queryset MiaoStudent.objects.all()print(queryset)serializer StudentSerializer(instancequeryset, manyTrue)return JsonResponse(serializer.data, safeFalse)# 创建数据def post(self, request):# 1、获取json参数并转化为python中的数据类型字典try:dic_data json.loads(request.body)except Exception as e:return JsonResponse({msg: 参数有误}, status400)# 获取反序列化的实例对象student_serializer_obj StudentSerializer(datadic_data)# 对数据进行校验# 校验不通过if not student_serializer_obj.is_valid():return JsonResponse(student_serializer_obj.errors, status400)# 创建数据执行saqlstudentMiaoStudent.objects.create(**student_serializer_obj.validated_data)# 对创建的数据进行数据回显序列化serializer StudentSerializer(instancestudent)return JsonResponse(serializer.data, status201)1、将原有的创建数据的代码
# 创建数据执行saqlstudentMiaoStudent.objects.create(**student_serializer_obj.validated_data)
替换成 # 创建数据执行saql# studentMiaoStudent.objects.create(**student_serializer_obj.validated_data)# 通过序列化器操作数据库student_serializer_obj.save()# 对创建的数据进行数据回显序列化#serializer StudentSerializer(instancestudent)return JsonResponse(student_serializer_obj.data, status201) 当构建序列化器对象时只传入data 参数。 # 获取反序列化的实例对象student_serializer_obj StudentSerializer(datadic_data)
序列化器再调用save方法时实际调用的是序列化器中的create方法。根据创建对象时传入的参数来判断执行save方法时具体调用create方法还是update方法。
构建序列化器实例时只传 data 调用save时调用的是create方法。
构建序列化器实例时同时传 data 与instance调用save时调用的是update方法。 2、在序列化器中创建create方法 def create(self, validated_data: dict):project_obj MiaoStudent.objects.create(**validated_data)return project_obj
将执行数据库的操作放到create方法中。
其中
validated_data: dict 为经过校验之后获取的用户输入数据时一个字典。 3、save方法关键字传参
执行save方法。
student_serializer_obj.save()
用户输入的是哪些字段则在操作数据库时就使用的哪些字段。
实现功能
我不仅要获取用户输入的哪些字段我还要在程序上额外加一些我想要加的字段。
可以通过
.save(关键字1:值1,关键字2:值2)
传入。
create方法获取经过校验的用户传入validated_data是一个字典。这个字典就包含我们刚刚额外传入的数据。
举例
调用save时传入
student_serializer_obj.save(address北京,hobbyplay)
执行create方法取出额外数据。 def create(self, validated_data: dict):address validated_data.pop(address)hobby validated_data.pop(address) project_obj MiaoStudent.objects.create(**validated_data)return project_obj 2.2 序列化器update方法
views视图中put 原来的代码 def put(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj MiaoStudent.objects.get(idpk)except Exception as e:return JsonResponse({msg: 参数有误}, status400)# 3、获取json参数并转化为字典try:dic json.loads(request.body)except Exception as e:return JsonResponse({msg: 参数有误}, status400)# 4、序列化将 用户输入的字典转化为序列化实例serializer_objStudentSerializer(datadic)# 5、序列化器对用户传入的参数进行校验# is_valid() 数据校验# serializer_obj.errors 校验后报错信息if not serializer_obj.is_valid():return JsonResponse(serializer_obj.errors, status400)# 6、更新数据,操作数据库student_obj.sname serializer_obj.validated_data.get(sname)student_obj.sgender serializer_obj.validated_data.get(sgender)student_obj.sid serializer_obj.validated_data.get(sid)student_obj.sscore serializer_obj.validated_data.get(sscore)student_obj.classid_id serializer_obj.validated_data.get(classid_id)student_obj.save()# 7、数据回显示非必需的。将读取的项目数据转化为字典serializer StudentSerializer(instancestudent_obj)return JsonResponse(serializer.data, status201)
1、视图函数创建序列化实例时使用data , instance
student_obj MiaoStudent.objects.get(idpk)
dic json.loads(request.body)
serializer_obj StudentSerializer(datadic, instancestudent_obj)
修改后视图函数的整体代码 class StudentsDetailView(View):def get(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj MiaoStudent.objects.get(idpk)except Exception as e:return JsonResponse({msg: 参数有误}, status400)serializer StudentSerializer(instancestudent_obj)return JsonResponse(serializer.data)def put(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj MiaoStudent.objects.get(idpk)except Exception as e:return JsonResponse({msg: 参数有误}, status400)# 3、获取json参数并转化为字典try:dic json.loads(request.body)except Exception as e:return JsonResponse({msg: 参数有误}, status400)# 4、序列化将 用户输入的字典转化为序列化实例# serializer_objStudentSerializer(datadic)serializer_obj StudentSerializer(datadic, instancestudent_obj)# 5、序列化器对用户传入的参数进行校验# is_valid() 数据校验# serializer_obj.errors 校验后报错信息if not serializer_obj.is_valid():return JsonResponse(serializer_obj.errors, status400)# 6、更新数据,操作数据库# student_obj.sname serializer_obj.validated_data.get(sname)# student_obj.sgender serializer_obj.validated_data.get(sgender)# student_obj.sid serializer_obj.validated_data.get(sid)# student_obj.sscore serializer_obj.validated_data.get(sscore)# student_obj.classid_id serializer_obj.validated_data.get(classid_id)# student_obj.save()serializer_obj.save()# 7、数据回显示非必需的。将读取的项目数据转化为字典# serializer StudentSerializer(instancestudent_obj)return JsonResponse(serializer_obj.data, status201)
2、序列化器中update方法 def update(self, instance, validated_data: dict):# for key, value in validated_data.items():# setattr(instance, key, value)# validated_data 是经过校验后用户传入的数据instance.sname validated_data.get(sname) or instance.snameinstance.sgender validated_data.get(sgender) or instance.sgenderinstance.sid validated_data.get(sid) or instance.sidinstance.sage validated_data.get(sage) or instance.sageinstance.sscore validated_data.get(sscore) or instance.sscoreinstance.classid_id validated_data.get(classid_id) or instance.classid_idinstance.save()return instance
or 是对值为空时的处理