ModelSerializer补充及ListSerializer
整体单改
路由层、模型层、序列化层不需要做修改,只需要处理视图层:views.py
"""
1) 单整体改,说明前台要提供修改的数据,那么数据就需要校验,校验的数据应该在实例化“序列化类对象”时,赋值给data
2)修改,就必须明确被修改的模型类对象,并在实例化“序列化类对象”时,赋值给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 校验规则失效
"""
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() # 通过源码我们知道instance不为none的时候才会走save()中的update,若依我们要拿到这个要更新数据的对象,把它赋给instanc
# 目的:将众多数据的校验交给序列化类来处理 - 让序列化类扮演反序列化角色,校验成功后,序列化类来帮你入库
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
# 重点:ListSerializer与ModelSerializer建立关联的是:
# ModelSerializer的Meta类的 - list_serializer_class
class 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
class 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的值,如果没有就返回None
pk = dic.pop('pk', None)
# 下面的作用是将pk的值添加到pks中,如果为None的话,直接返回异常,所以能走下的pks和request_data中的数据是一一对应的
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
})
总结
"""
整体修改和局部修改的区别:partial=True,使字段变成可选字段,也就是不用全都输入一遍(把整体改变成局部改)
单整体改时要注意为了走save()中的update要给instance传对象
单整体和单局部要把pk和request_data变成数组,并对数据进行筛选,然后将pk对应的对象取出放在一个数组里,循环用pk从数据库中拿出对应的对象放入一个对象数组中(如果出现了数据中没有的PK会报错),将pk对应的request_data的数据放入新的数组,将对象数组和新的request_data数组进行反序列化并保存(注意many=True)
"""
序列化流程小结
ser_obj = CarModelSerializer(数据) # 产生序列化类对象(可能参与序列化,也可能参与反序列化)
ser_obj.data # 序列化的数据
ser_obj.is_valid() # 启动序列化校验规则(系统内容=>局部钩子=>全局钩子)
ser_obj.save() # 序列化校验后的数据操作(保存、修改)
ModelSerializer补充及ListSerializer的更多相关文章
- 序列化模块ModelSerializer上补充及ListSerializer
		整体单改 路由层.模型层.序列化层不需要做修改,只需要处理视图层:views.py """ 1) 单整体改,说明前台要提供修改的数据,那么数据就需要校验,校验的数据应该在 ... 
- DRF框架(三)——media资源路径设置、多表设计复习及补充、序列化组件(ModelSerializer)操作多表(序列化与反序列化)、多表序列化与反序列化整合(重点)
		media资源路径设置 (设置好后把图片放在这个文件夹中,通过链接能访问到图片) 1.先在根目录设置一个media文件夹 2.配置settings.py,加上下面的 MEDIA_URL = '/me ... 
- drf框架 - 序列化组件 | ModelSerializer  (查,增,删,改)
		ModelSerializer 序列化准备: 配置 settings.py # 注册rest_framework框架 INSTALLED_APPS = [ ... 'rest_framework' ] ... 
- DjangoRestFramework学习二之序列化组件、视图组件 serializer  modelserializer
		DjangoRestFramework学习二之序列化组件.视图组件 本节目录 一 序列化组件 二 视图组件 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 序列化组 ... 
- ORM高阶补充:only, defer,select_related
		Queryset官方文档:https://docs.djangoproject.com/en/1.11/ref/models/querysets/ 1.需求1:只取某n列 1.方法1:values 2 ... 
- 整体单改,单局部改,整体局部改,ListSerializer类
		复习 """ 1.ModelSerializer序列化类 models.py class BaseModel(models.Model): is_delete = mod ... 
- DRF 序列化组件 模型层中参数补充
		一. DRF序列化 django自带有序列化组件,但是相比rest_framework的序列化较差,所以这就不提django自带的序列化组件了. 首先rest_framework的序列化组件使用同fr ... 
- 5) ModelSerializer(重点)  基表  测试脚本  多表关系建外键 正反查 级联 插拔式连表  序列化反序列化整合 增删查 封装response
		一.前戏要做好 配置:settings.py #注册drf INSTALLED_APPS = [ # ... 'api.apps.ApiConfig', 'rest_framework', ]  # ... 
- ModelSerializer 高级使用
		前言 ModelSerializer中还具有一些高级用法,如批量更新.批量删除.批量创建等. 但是批量过来的数据格式都需要与前端做好协商,什么样的数据格式是单条操作,什么样的数据格式是批量操作. 如下 ... 
随机推荐
- part10  header界面渐隐渐显 //动态路由//项目动画
			两个组件只同时显示一个 可以用 a v-show='variable' b: v-show='!variable' 1.对全局事件的解绑 //代码容易出现大量bug 因为影响其他组件 keep-al ... 
- 基于仿生算法的智能系统I
			仿生算法仿生算法是什么? 什么是仿生? 蜜蜂会造房子,人类就学习蜜蜂盖房子的方法,之后便有了航空建造工程的蜂窝结构. 仿生是模仿生物系统的功能和行为,来建造技术系统的一种科学方法.生活仿生作品现代的飞 ... 
- 十分简明易懂的FFT(快速傅里叶变换)
			https://blog.csdn.net/enjoy_pascal/article/details/81478582 FFT前言快速傅里叶变换 (fast Fourier transform),即利 ... 
- Python说文解字_Python之多任务_01
			Python 之 多任务: Python之多任务是现在多任务编程运用Python语言为载体的一种体现.其中涵盖:进程.线程.并发等方面的内容,以及包括近些年在大数据运算.人工智能领域运用强大的GPU运 ... 
- 应用层上的协议HTTP
			HTTP http://www.runoob.com/http/http-tutorial.html https://www.cnblogs.com/houfee/articles/9161847.h ... 
- 在excel中评估模型性能
			一直在用的结果, 从代码中整理出来. 评分卡模型的结果一般在excel中即可计算完成. 下面是在number中计算评分卡模型的性能(KS/AUC), 表格中百分数省略% 
- JAVA课程设计——俄罗斯方块(团队)
			1.团队介绍 1.1 团名:终于可以回家了嗷嗷嗷 1.2 团员介绍 2.参考来源 https://www.jb51.net/article/142716.htm 3.项目git地址 https://g ... 
- 出现UnboundLocalError: local variable 'a' referenced before assignment异常的情况与解决方法
			出现UnboundLocalError: local variable ‘a’ referenced before assignment异常的情况与解决方法字面意思:局部变量赋值前被引用原因:局部变量 ... 
- [CF百场计划]#3 Educational Codeforces Round 82 (Rated for Div. 2)
			A. Erasing Zeroes Description You are given a string \(s\). Each character is either 0 or 1. You wan ... 
- shell脚本判断进程是否运行
			zzx@zzx120:~$ if ps aux | grep "python"|grep -v grep > /dev/null #$?的值不同 th ... 
