drf 整体单改 局部单改 局部群改

整体单改

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

  如果partial值设置为True,就是可以局部改,partial设置True的本质就是使字段 required=True 校验规则失效

单整体修改,一般用put请求:

  V2BookModelSerializer(
      instance=要被更新的对象,
      data=用来更新的数据,
      partial=默认False,必须的字段全部参与校验
  )

单局部修改,一般用patch请求:
  V2BookModelSerializer(
      instance=要被更新的对象,
      data=用来更新的数据,
      partial=设置True,必须的字段都变为选填字段
  )

class V2Book(APIView):
     # 单整体改: 对 v2/books/(pk)/ 传的数据是与model对应的字典{name|price|publish|authors}
    def put(self, request, *args, **kwargs):
        request_data = request.data
        pk = kwargs.get(‘pk‘)
        old_book_obj = models.Book.objects.filter(pk=pk).first()     # 将众多数据的检验交给序列化类来处理,让序列化扮演反序列化处理, 校验成功后,序列化类帮你入库
        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
        })

单个与整体局部修改

序列化层:serializers.py

from rest_framework.serializers import ModelSerializer,SerializerMethodField,ListSerializer
class V2BookListSerializer(ListSerializer):
    def update(self, instance, validated_data):
        print(instance)  # 要更新的对象们
        print(validated_data)   # 更新的对象对应的数据们
        print(self.child)   # 服务的模型序列化类
        for index,obj in enumerate(instance):
            self.child.update(obj,validated_data[index])
        return instance    

视图层:views.py

class V2Book(APIView):  # 单局部改: 对v2/books/(pk)传的数据,数据字段key是选填  # 群局部改: 对v2/books/
    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 = []
            for dic in request_data:
                pk = dic.pop(‘pk‘,None)
                if pk:
                    pks.append(pk)
                else:
                    return Response({
                        ‘status‘: 1,
                        ‘msg‘: ‘数据有误‘
                    })
        else:
            return Response({
                ‘status‘: 1,
                ‘msg‘: ‘数据有误‘
            })    pks与request_data数据筛选,将pks中的没有对应数据的pk与数据已删除的pk移除,request_data对应索引位上的数据也移除,将合理的pks转换为 objs
        objs = []
        new_request_data = []
        for index,pk in enumerate(pks):
            try:
                obj = models.Book.objects.get(pk=pk)
                objs.append(obj)
                new_request_data.append(request_data[index])
            except:
                continue
        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
        })

原文地址:https://www.cnblogs.com/zrh-960906/p/11708514.html

时间: 2024-10-05 01:35:44

drf 整体单改 局部单改 局部群改的相关文章

DRF--十大接口方法:单查群查,单删群删,单增群增,整体单改群改,局部单改群改

from rest_framework.views import APIView from rest_framework.response import Response from . import models, serializers from .response import APIResponse # 出版社群查 class PublishAPIView(APIView): def get(self, request, *args, **kwargs): publish_query =

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

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

ORACLE11g R2【单实例 FS→单实例FS】

ORACLE11g R2[单实例 FS→单实例FS] 本演示案例所用环境:   primary standby OS Hostname pry std OS Version RHEL6.5 RHEL6.5 DB Version 11.2.0.4 11.2.0.4 db_name stephen stephen db_unique_name stephen standby service_names stephen standby instance_name stephen standby Pri

ORACLE10g R2【单实例 FS→单实例FS】

ORACLE10g R2[单实例FS→单实例FS] 本演示案例所用环境:   primary standby OS Hostname pry std OS Version RHEL5.8 RHEL5.8 DB Version 10.2.0.5 10.2.0.5 db_name stephen stephen db_unique_name stephen standby service_names stephen standby instance_name stephen standby Prim

jquery验证表单 提交表单

问题: jquery中使用submit提交按钮时,当return false后,依然会提交表单. 解决: 使用button按钮,而不是submit按钮 <script type="text/javascript" src="scripts/jquery-2.0.2.js"></script> <script type="text/javascript"> function check(){ var npassw

Bootstrap 表单和图片 (内联表单,表单合组,水平排列,复选框和单选框,下拉列表,校验状态,添加额外的图标,控制尺寸,图片)

一.表单 基本格式 注:只有正确设置了输入框的 type 类型,才能被赋予正确的样式. 支持的输入框控件 包括:text.password.datetime.datetime-local.date.month.time.week. number.email.url.search.tel 和 color. <form> <div class="form-group"> <label>电子邮件</label> <input type=&

Oracle Data Guard 单实例到单实例配置(物理standby)

接上一篇oracle dataguard概念篇,现在进行下详细的配置,此次配置的是单实例到单实例,也就是说主库和备库都是基于文件系统的单实例. 主机环境:Red Hat Enterprise Linux Server release 6.3 Rdbms版本:11.2.0.3 其他详细信息如下所示: 需要注意的是,两边的/etc/hosts文件保证都包含对方的ip对应关系 oracle安装的目录是相同的 编辑/etc/hosts,分别添加以下内容 192.168.1.241 db1 192.168

JavaScript-4.1-简单的表单操作,函数使用方法---ShinePans

<html> <head> <meta http-equiv="content-type" content="text/html;charset=GB2312"/> <title> 4.1 确认表单必填项目完整性 </title> <!--脚本部分--> <script type="text/javascript"> function check_submit()

医疗系统--体温单(三测单)系统

不同区域的体温单格式不尽相同,本文以江苏某地体温单为范例,介绍完整的体温单系统开发. 1.名词解释 体温单:又叫三测单,是护理病历的一部分.体温单主要用于记录患者的生命体征及有关情况,内容包括患者姓名.年龄.性别.科别.床号.入院日期.住院号(或病案号).日期.住院天数.手术后天数.脉搏.呼吸.体温.血压.出入量.大便次数.体重.身高.页码等. 2.体温单功能点 结合病历书写规范以及医生在临床中的习惯,电子体温单的功能点主要包括以下部分: 分类 序号 功能说明   1 表头(XXX医院,体温单)