1 序列化高级用法之source(了解)

  1. # 1.创建了5个表(图书管理的5个)
  2. # 2.对book进行序列化
  3. # 总结:source的用法
  4. 1.修改前端看到的字段key值--->source指定的必须是对象的属性
  5. book_name = serialiazers.CharField(source='name')
  6. 2.修改前端看到的value ---> source指定的必须是对象的方法
  7. 表模型中写方法
  8. def sb_name(self):
  9. return self.name = '_sb'
  10. 序列化类中
  11. book_name = serializers.CharField(source='sb_name')
  12. 3.可以关联查询(得有关联关系)
  13. publish_name = serializers.CharField(source='publish.name')

2 序列化高级用法之定制字段的两种方式(非常重要)

  1. # 方式一:在序列化类中写
  2. 1.写一个字段 对应的字段类是:SerializerMethodField
  3. 2.必须对应一个get_字段名的方法 方法必须接收一个obj 返回什么 这个字段对应的值就是什么
  4. # 方式二:在模型层中写
  5. 1.在表模型中写一个方法(可以使用:property),方法有返回值(字典,字符串,列表)
  6. 2.在序列化类中 使用DictField,CharField,ListField

2.1在序列化类中写

  1. class BookSerializer(serializer.Serializer):
  2. name = serializer.CharField()
  3. price = serializers.CharField()
  4. # 拿出出版社的id和名字和addr,放到一个字典中
  5. # 方式一:SerializerMethodField来定制,如果写了这个,必须配合一个方法get_字段名,这个方法返回什么,这个字段的值就是什么
  6. publish_detail = serializers.SerializerMethodField()
  7. def get_publish_detail(self,book):
  8. # print(obj) # 要序列化的book对象
  9. return {'id': book.publish.pk, 'name': book.publish.name, 'addr': book.publish.addr}
  10. # 练习:拿出所有作者的信息--》多条 [{'name':'','phone':''},{}]
  11. author_list = serializers.SerializerMethodField()
  12. def get_author_list(self,book):
  13. l = []
  14. for item in book.authors.all()
  15. l.append({'id': author.pk, 'name': author.name, 'phone': author.phone, 'age': author.author_detail.age})
  16. return l

2.2表模型中写

  1. ############################### 序列化类 #############################
  2. class BookSerializer(serializers.Serializer):
  3. name = serializers.CharField()
  4. price = serializers.CharField()
  5. # 1.序列化类中这样写
  6. # 2.到模型表中写一个方法 方法名必须叫publish_detail 这个方法返回什么 这个字段的value就是什么
  7. publish_detail = serializers.DictField()
  8. author_list = serializers.ListField()
  9. ################################ 表模型 ###########################
  10. class Book(models.Model):
  11. name = models.CharField(max_length=32)
  12. price = models.CharField(max_length=32)
  13. publish = models.ForeignKey(to='Publish', on_delete=models.SET_NULL, null=True)
  14. authors = models.ManyToManyField(to='Author')
  15. @property
  16. def publish_detail(self):
  17. return {'id': self.publish.pk, 'name': self.publish.name, 'addr': self.publish.addr}
  18. def author_list(self):
  19. l = []
  20. for author in self.authors.all():
  21. l.append({'id': author.pk, 'name': author.name, 'phone': author.phone, 'age': author.author_detail.age})
  22. return l

3 多表关联反序列化保存

  1. #序列化和反序列化 用的同一个序列化类
  2. 序列化的字段有:nameprice publish_detailauthor_list
  3. 反序列化字段:nameprice publishauthor

3.1反序列化之保存

视图类

  1. class BookView(APIView):
  2. def post(self, request):
  3. ser = BookSerialzier(data=request.data)
  4. if ser.is_valid():
  5. ser.save()
  6. return Response({'code': 100, 'msg': '成功'})
  7. else:
  8. return Response({'code': 100, 'msg': ser.errors})

序列化类

  1. class BookSerialzier(serializers.Serializer):
  2. # 即用来做序列化,又用来做反序列化
  3. name = serializers.CharField(max_length=8)
  4. price = serializers.CharField()
  5. # 这俩,只用来做序列化
  6. publish_detail = serializers.DictField(read_only=True)
  7. author_list = serializers.ListField(read_only=True)
  8. # 这俩,只用来做反序列化
  9. publish_id = serializers.IntegerField(write_only=True)
  10. authors = serializers.ListField(write_only=True)
  11. def create(self, validated_data): # {name:西游记,price:88,publish:1,authors:[1,2]
  12. authors = validated_data.pop('authors')
  13. book = Book.objects.create(**validated_data)
  14. book.authors.add(*authors)
  15. book.save()
  16. return book

3.2反序列化之修改

视图类

  1. class BookDetailView(APIView):
  2. def put(self, request,pk):
  3. book=Book.objects.get(pk=pk)
  4. ser = BookSerialzier(data=request.data,instance=book)
  5. if ser.is_valid():
  6. ser.save()
  7. return Response({'code': 100, 'msg': '更新成功'})
  8. else:
  9. return Response({'code': 100, 'msg': ser.errors})

序列化类

  1. class BookSerialzier(serializers.Serializer):
  2. # 即用来做序列化,又用来做反序列化
  3. name = serializers.CharField(max_length=8)
  4. price = serializers.CharField()
  5. # 这俩,只用来做序列化
  6. publish_detail = serializers.DictField(read_only=True)
  7. author_list = serializers.ListField(read_only=True)
  8. # 这俩,只用来做反序列化
  9. publish_id = serializers.IntegerField(write_only=True)
  10. authors = serializers.ListField(write_only=True)
  11. def update(self,instance,validated_data):
  12. authors = validated_data.pop('authors')
  13. for item in validated_data:
  14. setattr(instance,item,validated_data['item'])
  15. instance.authors.set(authors)
  16. instance.save()
  17. return instance

4 反序列化字段校验其他

  1. # 视图类中调用:ser.is_valid()--->触发数据的校验
  2. 4
  3. -字段自己的:max_lengthrequired。。。
  4. -字段自己的:配合一个函数name = serializers.CharField(max_length=8,validators=[xxx])
  5. -局部钩子
  6. -全局钩子

5 ModelSerializer使用

  1. # 之前写的序列化类 继承了Serializer 写字段 跟表模型没有必然联系
  2. class XXSerializer()
  3. id=serializer.CharField()
  4. name=serializer.CharField()
  5. XXSerialzier既能序列化Book,又能序列化Publish
  6. # 现在学的ModelSerializer,表示跟表模型一一对应,用法跟之前基本类似
  7. 1 写序列化 继承ModelSerializer
  8. 2 在序列化类中 再写一个类 必须交
  9. class Meta:
  10. model=表模型
  11. fields=[] # 要序列化的字段
  12. 3 可以重写字段 一定不要放在class Meta
  13. 定制字段 跟上面一样
  14. 4 自定制的字段 一定要在fields中注册一下
  15. 5 class Meta: 有个extra_kwargs 为某个字段定制字段参数
  16. 6 局部钩子 全局钩子 完全一致
  17. 7 大部分情况下 不需要重写 createupdate

drf——序列化之source(了解)、定制字段的两种方式(重要)、多表关联反序列化保存、反序列化字段校验、ModelSerializer使用的更多相关文章

  1. 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键字段的反序列化保存 序列化类继承ModelSerializer 反序列化数据校验源码分析

    目录 序列化类常用字段类和字段参数 常用字段类 常用字段参数 选项参数 通用参数 序列化类高级用法之source source填写类中字段 source填写模型类中方法 source支持跨表查询 定制 ...

  2. django框架之drf:04、序列化器常用字段及参数,序列化器高级用法之source、定制字段数据的两种方法、多表关联反序列化的保存、ModelSerializer的使用

    Django框架之drf 目录 Django框架之drf 一.序列化器常用字段及参数 1.常用字段 2.常用字段参数 3.字段参数针对性分类 二.序列化器高级用法之source 1.定制字段名 三.定 ...

  3. drf-day4——序列化类常用字段和字段参数、序列化类source用法、序列化类定制字段返回内容的两种方式、序列化类的多表关联反序列化保存、反序列化字段校验、ModelSerializer的使用

    目录 一.序列化类常用字段和字段参数(了解) 1.1 常用字段类 1.2 常用字段参数 选项参数: 通用参数: 重点 二.序列化高级用法之source(了解) 2.1 序列化定制字段名字 三.序列化高 ...

  4. Elasticsearch模糊查询、多字段in查询、时间范围查询,DSL和java API两种方式

    Elasticsearch模糊查询.多字段in查询.时间范围查询,DSL和java API两种方式 项目场景: Elasticsearch模糊查询某字段.多字段in查询.时间范围查询,通过DSL和ja ...

  5. DRF 序列化组件 序列化的两种方式 反序列化 反序列化的校验

    序列化组件 django自带的有序列化组件不过不可控不建议使用(了解) from django.core import serializers class Books(APIView): def ge ...

  6. java 的对象拷贝(有深浅拷贝两种方式,深拷贝实现的两种方式(逐层实现cloneable接口,序列化的方式来实现))

    Java提高篇--对象克隆(复制)(转自:http://www.cnblogs.com/Qian123/p/5710533.html#_label0)   阅读目录 为什么要克隆? 如何实现克隆 浅克 ...

  7. K:java中序列化的两种方式—Serializable或Externalizable

    在java中,对一个对象进行序列化操作,其有如下两种方式: 第一种: 通过实现java.io.Serializable接口,该接口是一个标志接口,其没有任何抽象方法需要进行重写,实现了Serializ ...

  8. drupal7 覆写node-type.tpl.php获取字段值的两种方式

    字段的机读名称为:field_publication_date <!-- 下面两种方式都可以获取node字段的值--> 出版时间: <?php print date('Y-m-d', ...

  9. 一步步分析Java深拷贝的两种方式-clone和序列化

    今天遇到一道面试题,询问深拷贝的两种方法.主要就是clone方法和序列化方法.今天就来分析一下这两种方式如何实现深拷贝.如果想跳过解析的朋友,直奔"重点来了!"寻找答案. clon ...

  10. Django学习——ajax发送其他请求、上传文件(ajax和form两种方式)、ajax上传json格式、 Django内置序列化(了解)、分页器的使用

    1 ajax发送其他请求 1 写在form表单 submit和button会触发提交 <form action=""> </form> 注释 2 使用inp ...

随机推荐

  1. Github学生认证具体步骤

    具体步骤展示 一.进入相关的申请地址 地址在此:https://education.github.com/pack/ 二.选中右上方的Student,然后选择第二个选项 在我们已经注册号Github账 ...

  2. Python--相关环境的安装,以及hello world的实现

    相关环境 进入官网:https://www.python.org/downloads/ 点击这里: 来到新的界面之后,向下滑动: 找到上图中的界面,选择版本进行下载即可. 具体的安装步骤可以参考这里看 ...

  3. FastJson 反序列化漏洞原理分析

    Fastjson 简介 fastjson框架:https://github.com/alibaba/fastjson fastjson-jndi:https://github.com/earayu/f ...

  4. Resistance distance 图上2个节点的等效电阻求解算法

    目录 如何计算正方体网络中(乃至更一般的图)2个节点间的等效电阻? 公式的正确性很容易得到验证 如何计算Weighted matrix的Resistance matrix 我验证了特例,是对的,但是对 ...

  5. Schillace 定律 背后的 Sam Schillace

    微软semantic-kernel(SK)团队发布了一篇博客文章:Early Lessons From GPT-4: The Schillace Laws[1] ,微软的CVP , Deputy CT ...

  6. Go语言:编写一个 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL。如果两个 URL 在 10 秒内都未返回结果,返回一个 error。

    问题: 你被要求编写一个叫做 WebsiteRacer 的函数,用来对比请求两个 URL 来「比赛」,并返回先响应的 URL.如果两个 URL 在 10 秒内都未返回结果,那么应该返回一个 error ...

  7. 关于微人事中POI导入文件到数据库的异常以及自己的一些技术心得

    前言 在近四个月的时间里面,我的微人事项目才逐渐接近尾声,在昨天的测试接口中出现了两次数组越界以及一次空指针异常,三处异常我都通过吊事bug根据项目实际情况解决了,但是在空指针异常那里还是带有疑问,起 ...

  8. 介绍一下js垃圾回收机制

    JavaScript中的垃圾回收机制负责自动管理内存,回收不再使用的对象所占用的内存空间.在JavaScript中,开发者不需要显式地分配和释放内存,垃圾回收器会自动完成这些操作.以下是关于JavaS ...

  9. CentOS7---部署Tomcat和安装Jpress

    总览需求 1. 简述静态网页和动态网页的区别. 2. 简述 Webl.0 和 Web2.0 的区别. 3. 安装tomcat8,配置服务启动脚本,部署jpress应用. 1.简述静态网页和动态网页的区 ...

  10. Pytorch实践模型训练(损失函数)

    一个深度学习项目包括了: 模型设计.损失函数设计.梯度更新方法.模型保存和加载和模型训练,其中损失函数就像一把衡量模型学习效果的尺子,训练模型的过程就是优化损失函数的过程,模型拿到数据之后有一个非常重 ...