DRF框架(四)——单整体改(put)、单局部改(patch)、群局部改(patch)

单整体改   单指的是单独一条数据,整体指这条数据的所有字段都必须传值修改

基于上篇文章的代码修改,序列化层不用变,只修改views.py

1) 单整体改,说明前台要提供修改的数据,那么数据就需要校验,校验的数据应该在实例化“序列化类对象”时,赋值给data
2)修改,就必须明确被修改的模型类对象,并在实例化“序列化类对象”时,赋值给instance,必须赋值给instance
3)整体修改,所有校验规则有required=True的字段,都必须提供,因为在实例化“序列化类对象”时,参数partial默认为False

注:如果partial值设置为True,就是可以局部改
1)单整体修改,一般用put请求:
V2BookModelSerializer(
    instance=要被更新的对象,
    data=用来更新的数据,
    partial=默认False,必须的字段全部参与校验
)
2)单局部修改,一般用patch请求:
V2BookModelSerializer(
    instance=要被更新的对象,
    data=用来更新的数据,
    partial=设置True,必须的字段都变为选填字段
)
    注:partial设置True的本质就是使字段 required=True 校验规则失效
请求方法:put   整体修改
请求参数:pk从路由传参,修改的数据通过数据包json传递
请求接口: http://127.0.0.1:8080/app01/v3/books/pk/

视图层:views.py

#单整体改  对 v3/books/pk/  传的参数是与model对应的字典 {name|price|publish|authors}在json中传递
class V3Book(APIView):
    def put(self,request,*args,**kwargs):
        request_data = request.data
        pk = kwargs.get(‘pk‘)
        #先获取要修改的对象
        try:
            old_book_obj = models.Book.objects.get(pk=pk,is_delete=False)
        except:
            #当输入不存在的pk
            return Response({
                ‘status‘:1,
                ‘msg‘:‘参数错误‘
            })
        book_ser = serializers.V2BookModelSerializer(instance=old_book_obj,data=request_data,partial=False)
        book_ser.is_valid(raise_exception=True)
        book_obj = book_ser.save()

        return Response({
            ‘status‘:0,
            ‘msg‘:‘ok‘,
            ‘results‘:serializers.V2BookModelSerializer(book_obj).data
        })

单整体修改注意点(******)

1.需要修改的数据通过data传递
2.需要修改的模型类对象必须传递给instance
3.参数partial设置为False (默认是False,这里不设置也行)

单局部修改

单整体修改和单局部修改只有一点不相同:

设置参数partial=True,就变成单局部修改,修改的参数就不必全部传,想修改什么数据就传什么数据

单局部修改和群局部修改整合

序列化层 serializer.py

群改需要设置ListSerializer,创建V2BookListSerializer继承ListSerializer,重写update方法

# 重点:ListSerializer与ModelSerializer建立关联的是:
# ModelSerializer的Meta类的 - list_serializer_class
class V2BookListSerializer(ListSerializer):   def update(self, instance, validated_data):  #需要重写update方法
        # print(instance)  # 要更新的对象们
        # print(validated_data)  # 更新的对象对应的数据们
        # print(self.child)  # 服务的模型序列化类 - V2BookModelSerializer
        for index, obj in enumerate(instance):
            self.child.update(obj, validated_data[index])
        return instance

# 原模型序列化类变化
class V2BookModelSerializer(ModelSerializer):
    class Meta:
        # ...
        # 群改,需要设置 自定义ListSerializer,重写群改的 update 方法
        list_serializer_class = V2BookListSerializer
请求方式:patch
请求参数:pk从路由获取,修改参数从数据包通过json格式传递  单局部修改: v3/books/pk/  pk通过路由传参,修改数据通过json传参  群局部修改: v3/books/ 修改的数据都是从json传递   eg:[{‘pk‘:1,‘name‘:‘花果山‘},{‘pk‘:2,‘price‘:3.33}]
请求接口:http://127.0.0.1:8080/app01/v3/books/pk/

视图层:views.py

 #单局部改和群局部改整合
    #单局部改:对 v3/books/pk/   pk通过路由传参,修改数据选择传参,通过数据包json传递
    #群局部修改:v3/books/ 修改数据通过数据包传递,设置成列表格式  [{pk:1,name:123},{pk:3,price:7},{pk:7,publish:2}]
    def patch(self,request,*args,**kwargs):
        request_data = request.data  #数据包数据
        pk = kwargs.get(‘pk‘)
        # 将单改,群改的数据都格式化成 pks=[要需要的对象主键标识] | request_data=[每个要修改的对象对应的修改数据]
        if pk and isinstance(request_data,dict):  #单改
            pks = [pk,]
            request_data = [request_data,]
        elif not pk and isinstance(request_data,list):  #群改
            pks = []
            # 遍历前台数据[{pk:1, name:123}, {pk:3, price:7}, {pk:7, publish:2}],拿一个个字典
            for dic in request_data:
                pk=dic.pop(‘pk‘,None)  #返回pk值
                if pk:
                    pks.append(pk)
                #pk没有传值
                else:
                    return Response({
                        ‘status‘:1,
                        ‘msg‘:‘参数错误‘
                    })
        else:
            return Response({
                ‘status‘: 1,
                ‘msg‘: ‘参数错误‘
            })
        # pks与request_data数据筛选,
        # 1)将pks中的没有对应数据的pk与数据已删除的pk移除,request_data对应索引位上的数据也移除
        # 2)将合理的pks转换为 objs
        objs = []
        new_request_data = []
        for index,pk in enumerate(pks):
            try:
                #将pk合理的对象数据保存下来
                book_obj = models.Book.objects.get(pk=pk)
                objs.append(book_obj)
                #对应索引的数据也保存下来
                new_request_data.append(request_data[index])
            except:
                # 重点:反面教程 - pk对应的数据有误,将对应索引的data中request_data中移除
                #在for循环中不要使用删除
                # index = pks.index(pk)
                # request_data.pop(index)
                continue
        #生成一个serializer对象
        book_ser = serializers.V2BookModelSerializer(instance=objs,data=new_request_data,partial=True,many=True)
        book_ser.is_valid(raise_exception=True)
        book_objs = book_ser.save()

        return Response({
            ‘status‘:0,
            ‘msg‘:‘ok‘,
            ‘results‘:serializers.V2BookModelSerializer(book_objs,many=True).data
        })

思路:

1.先将单改,群改的数据都格式化成 pks=[要需要的对象主键标识] | request_data=[每个要修改的对象对应的修改数据]
2.pks与request_data数据筛选,
      将pks中的没有对应数据的pk与数据已删除的pk移除,request_data对应索引位上的数据也移除
       将合理的pks转换为 objs

 注意点:

1.本篇文章讲了局部修改patch,和整体修改put,都需要设置参数instance,传入的是要修改的对象,data传入的是修改的数据2.群修改的话需要使用ListSerializer,重写update方法

原文地址:https://www.cnblogs.com/wangcuican/p/11695273.html

时间: 2024-08-30 15:18:15

DRF框架(四)——单整体改(put)、单局部改(patch)、群局部改(patch)的相关文章

drf框架, 接口(api) Django FBV => CBV drf框架的基础试图类 drf核心组件 群查与单查 python换源

接口 """ 接口概念:前台与后台进行信息交互的媒介 - url链接 接口组成: url链接 - 长得像返回数据的url链接 请求方式 - get(查).post(增).put(整体改).patch(局部改).delete(删) 请求参数 - 拼接参数.数据包参数(urlencoded.form-data.json) 响应结果 - 响应的json数据 """ 开发阶段接口测试工具 """ Postman: 官网下载.

整体单改,单局部改,整体局部改,ListSerializer类

复习 """ 1.ModelSerializer序列化类 models.py class BaseModel(models.Model): is_delete = models.BooleanFiled(default=Flase) class Meta: abstract = True # ***** class Car(BaseModel): name = models.CharFiled(max_length=64) @property def my_name(self

表单提交(四)——不能提交表单

Forms and their child elements should not use input names or ids that conflict with properties of a form, such as submit, length, or method. Name conflicts can cause confusing failures. For a complete list of rules and to check your markup for these

(四)Jquery Mobile表单

Jquery Mobile表单与列表 一.JM表单      1.表单      普通html表单            效果:          2.只能输入数字的表单           效果:              说明:label中的for="number-pattern" 就是说,当我们点击label是就会获取到id="number-pattern"的焦点,也就是下面input框的焦点. 3.文件文本框            效果:       4.密

DRF框架 之基础配置

Vue框架的总结 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 {{ }} v-text|html => 限制一次性渲染 v-once v-if|show v-if v-else-if v-else v-for v-model v-bind [c1, c2] | {active: isActive} v-on fn | fn(...) | fn($event, .

drf框架相关

drf框架: django-rest framework 1.接口:联系两个物质的媒介,完成信息交互 web程序中:联系前台页面与后台数据库的媒介,已完成信息的交互; web接口组成: url:长得像放回数据的url链接 请求参数:前台按照指定的key提供数据给后台 响应数据:后台与数据库交互后将数据反馈给前台 2.restful接口规范 -> 规范化书写接口 定义:为了采用不同的后台语言,也能用同样的接口来获取到同样的数据; 接口文档: 写接口要写 url,响应数据 注:如果将请求参数也纳入考

drf框架与postman初始

drf框架 全称:django-rest framework 知识点 """ 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件.解析组件.响应组件 4.序列化组件(灵魂) 5.三大认证(重中之重):认证.权限(权限六表).频率 6.其他组件:过滤.筛选.排序.分页.路由 """ # 难点:源码分析 接口 """ 接口:联系两个物质的媒介,完成

drf 框架

一. DRF框架: 全称: django-rest framework 知识点: 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件.解析组件.响应组件 4.序列化组件(灵魂) 5.三大认证(重中之重):认证.权限(权限六表).频率 6.其他组件:过滤.筛选.排序.分页.路由 二. 接口 接口:联系两个物质的媒介,完成信息交互 web程序中:联系前台页面与后台数据库的媒介 web接口组成: url:长得像返回数据的url链

DRF框架知识总览

DRF框架知识总览 """ 1)接口(api): 什么是接口 接口文档 接口规范 2)FBV => CBV:Function|Class Base View CBV的请求生命周期 CBV比FBV的优势 3)drf框架的基础试图类 APIView:请求模块.解析模块.渲染模块.响应模块.异常模块 4)drf核心组件 序列化组件:将后台的任何数据,进行序列化返回给前台:将前台的数据反序列化成后台model对象再入库 三大认证组件:认证组件.权限组件(RBAC).频率组件 视