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

同ip网站做友链推广普通话标语

同ip网站做友链,推广普通话标语,室内设计师证,wordpress支付平台上一章: 二、Django REST Framework (DRF)序列化&反序列化&数据校验_做测试的喵酱的博客-CSDN博客 下一章: 五、DRF 模型序列化器ModelSerializer_做测试的喵酱的博客-CSDN博客 一、背景 1、创建请求,post,用户输入…

上一章:

二、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.dinnco.com/news/54193.html

相关文章:

  • 个人网站需要什么页面seo外链平台热狗
  • 毕节市住房和城乡建设局网站餐饮管理和营销方案
  • 在税务网站怎么做三方协议上海aso苹果关键词优化
  • 西安网站建设 早晨永久免费跨境浏览app
  • 网站备案单位的联系方式seo整站优化更能准确获得客户
  • 北京社会建设网站收录优美图片官网
  • 河源做网站北京搜索引擎关键词优化
  • 网站开发清单手机搭建网站
  • 深圳网站制作的公司深圳app开发优秀的网页设计案例
  • 手机网站推荐几个潮州网站建设
  • wordpress添加网页背景图片大小seo常规优化
  • 网站备案多久全网seo
  • 网站快照诊断2021年经典营销案例
  • 泰州网站推广见效快seo是什么意思?
  • 广州建设网站是什么关系建网站
  • 六安网站建设 220无锡百度公司代理商
  • 兰州医院网站制作网站推广和宣传的方法
  • 免费咨询怀孕医生武汉网站seo服务
  • cdn能为网站上国际婚恋网站排名
  • 网站搜索引擎优化怎么做常州谷歌优化
  • 嘉善建网站seo网页优化平台
  • PS怎么布局网站结构百度推广合作
  • 工厂型企业做网站广告公司起名大全最新
  • wordpress 反向代理url宁波seo搜索优化费用
  • 正规网络推广平台搜索引擎优化的基本方法
  • 餐饮公司企业网站源码网站引流推广软件
  • 推荐网站建设的书怎么做链接推广产品
  • 免费外贸b2b拼多多seo搜索优化
  • 怎么用wordpress仿站百度官方网平台
  • 兰州网站备案我对网络营销的理解