当前位置: 首页 > news >正文

四、DRF序列化器create方法与update方法

上一章:

二、Django REST Framework (DRF)序列化&反序列化&数据校验_做测试的喵酱的博客-CSDN博客

下一章:

五、DRF 模型序列化器ModelSerializer_做测试的喵酱的博客-CSDN博客 

一、背景

1、创建请求,post,用户输入json数据,就可以直接创建一条数据

2、更新请求,put,需要两类数据:

  1. 用户传入的json数据,具体需要更新的哪些字段。
  2. 需要先去库里取出需要更新的实例,再来对它更新。

我们现在的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方法中。

其中:

  1. 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
  1. or 是对值为空时的处理

http://www.lryc.cn/news/89663.html

相关文章:

  • 洛谷P8792 最大公约数
  • 【SpringBoot集成Nacos+Dubbo】企业级项目集成微服务组件,实现RPC远程调用
  • MySQL主从同步(开GTID)
  • 打造精细化调研,这些产品榜上有名,你用了吗?
  • [golang gin框架] 37.ElasticSearch 全文搜索引擎的使用
  • 赋的几个发展阶段
  • Model-Free TD Control: Sarsa
  • CloudBase CMS的开发注意事项
  • 大佬联合署名!反对 ACL 设置匿名期!
  • 【JavaSE】Java基础语法(十四):Static
  • 1.Linux初识
  • 进程(二)
  • 《消息队列高手课》课程笔记(二)
  • 以“智”提质丨信创呼叫
  • Pool与PG的说明以及Ceph的IO流程
  • 20230529_Hadoop_集群操作命令
  • 边缘计算AI硬件智能分析网关V1版的接入流程与使用步骤
  • 【redis】Stream、String 超详细介绍
  • 算法基础学习笔记——⑫最小生成树\二分图\质数\约数
  • 了解信号的传输方式、编码与调制、信道的极限容量
  • SpringBoot自动配置原理总结
  • 【LeetCode: 410. 分割数组的最大值 | 暴力递归=>记忆化搜索=>动态规划 】
  • 内核对象和两种同步
  • 水表远程监控系统有什么功能吗?
  • zabbix自定义监控
  • 【AUTOSAR】Com通讯栈配置说明(四)---- Nm模块
  • IMG CXM GPU:面向复杂消费级设备的无缝视觉体验
  • Kafka如何保证数据高可靠
  • OpenWRT 中修改SSID的文件
  • 如何在 Linux 中进行网络地址转换 (NAT)?