四、DRF序列化器create方法与update方法
上一章:
二、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': '参数有误'}, status=400)# 获取反序列化的实例对象class_obj = ClassSerializer(data=dic_data)# 对数据进行校验# 校验不通过if not class_obj.is_valid():return JsonResponse(class_obj.errors, status=400)# 创建数据,执行saqlmiaoclass = MiaoClass.objects.create(**class_obj.validated_data)# 对创建的数据进行数据回显(序列化)serializer = ClassSerializer(instance=miaoclass)return JsonResponse(serializer.data, status=201)
更新请求,put:
def put(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj = MiaoStudent.objects.get(id=pk)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 3、获取json参数并转化为字典try:dic = json.loads(request.body)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 4、序列化,将 用户输入的字典,转化为序列化实例serializer_obj=StudentSerializer(data=dic)# 5、序列化器对用户传入的参数进行校验# is_valid() 数据校验# serializer_obj.errors 校验后报错信息if not serializer_obj.is_valid():return JsonResponse(serializer_obj.errors, status=400)# 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(instance=student_obj)return JsonResponse(serializer.data, status=201)
二、序列化器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(instance=queryset, many=True)return JsonResponse(serializer.data, safe=False)# 创建数据def post(self, request):# 1、获取json参数并转化为python中的数据类型(字典)try:dic_data = json.loads(request.body)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 获取反序列化的实例对象student_serializer_obj = StudentSerializer(data=dic_data)# 对数据进行校验# 校验不通过if not student_serializer_obj.is_valid():return JsonResponse(student_serializer_obj.errors, status=400)# 创建数据,执行saqlstudent=MiaoStudent.objects.create(**student_serializer_obj.validated_data)# 对创建的数据进行数据回显(序列化)serializer = StudentSerializer(instance=student)return JsonResponse(serializer.data, status=201)
1、将原有的创建数据的代码
# 创建数据,执行saqlstudent=MiaoStudent.objects.create(**student_serializer_obj.validated_data)
替换成
# 创建数据,执行saql# student=MiaoStudent.objects.create(**student_serializer_obj.validated_data)# 通过序列化器操作数据库student_serializer_obj.save()# 对创建的数据进行数据回显(序列化)#serializer = StudentSerializer(instance=student)return JsonResponse(student_serializer_obj.data, status=201)
当构建序列化器对象时,只传入data= 参数。
# 获取反序列化的实例对象student_serializer_obj = StudentSerializer(data=dic_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="北京",hobby="play")
执行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(id=pk)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 3、获取json参数并转化为字典try:dic = json.loads(request.body)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 4、序列化,将 用户输入的字典,转化为序列化实例serializer_obj=StudentSerializer(data=dic)# 5、序列化器对用户传入的参数进行校验# is_valid() 数据校验# serializer_obj.errors 校验后报错信息if not serializer_obj.is_valid():return JsonResponse(serializer_obj.errors, status=400)# 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(instance=student_obj)return JsonResponse(serializer.data, status=201)
1、视图函数:创建序列化实例时,使用data= , instance=
student_obj = MiaoStudent.objects.get(id=pk)
dic = json.loads(request.body)
serializer_obj = StudentSerializer(data=dic, instance=student_obj)
修改后视图函数的整体代码
class StudentsDetailView(View):def get(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj = MiaoStudent.objects.get(id=pk)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)serializer = StudentSerializer(instance=student_obj)return JsonResponse(serializer.data)def put(self, request, pk):# 1、需要校验pk在数据库中是否存在# 2、从数据库中读取项目数据try:student_obj = MiaoStudent.objects.get(id=pk)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 3、获取json参数并转化为字典try:dic = json.loads(request.body)except Exception as e:return JsonResponse({'msg': '参数有误'}, status=400)# 4、序列化,将 用户输入的字典,转化为序列化实例# serializer_obj=StudentSerializer(data=dic)serializer_obj = StudentSerializer(data=dic, instance=student_obj)# 5、序列化器对用户传入的参数进行校验# is_valid() 数据校验# serializer_obj.errors 校验后报错信息if not serializer_obj.is_valid():return JsonResponse(serializer_obj.errors, status=400)# 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(instance=student_obj)return JsonResponse(serializer_obj.data, status=201)
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 是对值为空时的处理