django drf 10大请求序列化方法


## 整体单改

路由层、模型层、序列化层不需要做修改,只需要处理视图层:views.py

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

注:如果partial值设置为True,就是可以局部改1)单整体修改,一般用put请求:V2BookModelSerializer(    instance=要被更新的对象,     data=用来更新的数据,    partial=默认False,必须的字段全部参与校验)2)单局部修改,一般用patch请求:V2BookModelSerializer(    instance=要被更新的对象,     data=用来更新的数据,    partial=设置True,必须的字段都变为选填字段)    注:partial设置True的本质就是使字段 required=True 校验规则失效"""```

```pythonclass 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

```python# 重点:ListSerializer与ModelSerializer建立关联的是:# ModelSerializer的Meta类的 - list_serializer_classclass V2BookListSerializer(ListSerializer):    def update(self, instance, validated_data):        # 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    # ...```

##### 视图层:views.py

```pythonclass V2Book(APIView):    # 单局部改:对 v2/books/(pk)/ 传的数据,数据字段key都是选填    # 群局部改:对 v2/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 = []            for dic in request_data:  # 遍历前台数据[{pk:1, name:123}, {pk:3, price:7}, {pk:7, publish:2}],拿一个个字典                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数据筛选,        # 1)将pks中的没有对应数据的pk与数据已删除的pk移除,request_data对应索引位上的数据也移除        # 2)将合理的pks转换为 objs        objs = []        new_request_data = []        for index, pk in enumerate(pks):            try:                # pk对应的数据合理,将合理的对象存储                obj = models.Book.objects.get(pk=pk)                objs.append(obj)                # 对应索引的数据就需要保存下来                new_request_data.append(request_data[index])            except:                # 重点:反面教程 - pk对应的数据有误,将对应索引的data中request_data中移除                # index = pks.index(pk)                # request_data.pop(index)                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/Sunbreaker/p/11695619.html

时间: 2024-11-07 21:16:33

django drf 10大请求序列化方法的相关文章

Django 1.10 中文文档------3.3.8 会话sessions

django支持匿名会话.它将数据存放在服务器端,并抽象cookies的发送和接收过程.cookie包含一个会话ID而不是数据本身(除非你使用的是基于后端的cookie). 3.3.8.1 启用会话 Django通过一个中间件来实现会话功能.要启用会话就要先启用该中间件.编辑MIDDLEWARE设置,确保存在django.contrib.sessions.middleware.SessionMiddleware这一行.默认情况在新建的项目中它是存在的. 如果你不想使用会话功能,那么在settin

Django 1.10 找不到静态资源解决方法

测试版本:Django 1.10 问题:Django项目找不到静态资源 解决方法: 1.首先你需要在自己的app下面创建2个目录 static 和  templates 树形结构如下(DjangoProject 是我的项目名  blogs 是app名,要创建的目录在blogs下) DjangoProject/ ├── db.sqlite3 ├── manage.py ├── DjangoProject │   ├── __init__.py │   ├── settings.py │   ├──

Django 1.10文档中文版Part1

目录 第一章.Django1.10文档组成结构1.1 获取帮助1.2 文档的组织形式1.3 第一步1.4 模型层1.5 视图层1.6 模板层1.7 表单1.8 开发流程1.9 admin站点1.10 安全性1.11 国际化和本地化1.12 性能和优化1.13 Python兼容性1.14 地理框架1.15 常用WEB应用工具1.16 其它核心功能1.17 Django开源项目 第二章.起步2.1 Django速览 2.1.1 设计你的模型model 2.1.2 安装model 2.1.3 使用AP

DRF框架之 serializers 序列化组件

1. 什么是序列化,其实在python中我们就学了序列化工具json工具,就是吧信息存为类字典形式 2. DRF框架自带序列化的工具: serializers 3. DRF框架 serializers 分为:第一种 Serializer   第二种 ModelSerializer 第一种用法之 Serializer from django.db import models # Create your models here. class Book(models.Model): nid = mod

序列化类外键字段的覆盖,十大接口序列化总结,视图家族

序列化类外键字段的覆盖 """ 1)在序列化类中自定义字段,名字与model类中属性名一致,就称之为覆盖操作 (覆盖的是属性的所有规则:extra_kwargs中指定的简易规则.model字段提供的默认规则.数据库唯一约束等哪些规则) 2)外键覆盖字段用PrimaryKeyRelatedField来实现,可以做到只读.只写.可读可写三种形式 只读:read_only=True 只写:queryset=关联表的queryset, write_only=True 可读可写:que

使用HAProxy、PHP、Redis和MySQL支撑10亿请求每周架构细节

[编者按]在公司的发展中,保证服务器的可扩展性对于扩大企业的市场需要具有重要作用,因此,这对架构师提出了一定的要求.Octivi联合创始人兼软件架构师Antoni Orfin将向你介绍一个非常简单的架构,使用HAProxy.PHP.Redis和MySQL就能支撑每周10亿请求.同时,你还能了解项目未来的横向扩展途径及常见的模式. 以下为译文: 在这篇文章中,我将展示一个非常简单的架构,使用HAProxy.PHP.Redis和MySQL支撑每周10亿请求.除此之外,我还将展示项目未来的横向扩展途径

django中使用Profile扩展User模块(基于django 1.10版本下)

版本:Django 1.10.1(其他版本可能有不同的实现好解决办法) 参考官方文档:https://docs.djangoproject.com/en/1.10/topics/auth/customizing/ 在开发过程中,Django的用户管理模块能够给我们带来非常大的便利,但是Django的User模块所提供的字段太少,所以对User模块的扩展是必须的,下面结合我自己的开发过程中,使用Profile扩展User模块时遇到的问题以及解决的方法进行记录. 先看一段我根据官方文档最先开发完成的

使用HAProxy、PHP、Redis和MySQL支撑每周10亿请求

在公司的发展中,保证服务器的可扩展性对于扩大企业的市场需要具有重要作用,因此,这对架构师提出了一定的要求.Octivi联合创始人兼软件架构师Antoni Orfin将向你介绍一个非常简单的架构,使用HAProxy.PHP.Redis和MySQL就能支撑每周10亿请求.同时,你还能了解项目未来的横向扩展途径及常见的模式. 状态 服务器 3个应用程序节点 2个MySQL+1个备份 2个Redis 应用程序 应用程序每周处理10亿请求 峰值700请求/秒的单Symfony2实例(平均工作日约550请求

2017 编程趋势预测:10大技术大热,10大技术遇冷

在编程世界,流行的是科学,严谨和精确的准则.这不是说编程是一种缺乏趋势的行业.不同的是,由于编程重视的是高效,用户化和使用方便,因此编程技术需要不断更新换代. 那么,在即将到来的2017年和未来的几年内,会有哪些新技术出现,成为新的潮流,又有哪些技术的热潮会渐渐消退呢?下面所列出的10种技术,摘自infoworld.com的一位编辑Peter Wayner撰写的文章21 hot programming trends -- and 21 going cold.本文旨在与大家一起讨论这个话题. 1.