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. FinOps首次超越安全成为企业头等大事丨云计算趋势报告

    随着云计算在过去十年中的广泛应用,云计算用户所面临的一个持续不变的趋势是:安全一直是用户面临的首要挑战.然而,这种情况正在发生转变. 知名IT软件企业 Flexera 对云计算决策者进行年度调研已经持 ...

  2. 如何针对海外不同地区进行音视频自动化测试?丨Dev for Dev 专栏

    近年来由于全球性的新冠疫情,世界各地对实时音视频的需求猛增.不同国家和地区由于经济发展.国家政策等原因,网络环境有很大不同,如果要做好音视频体验,就需要分地域进行音视频指标测试.但是不论是外包,还是云 ...

  3. Java并发夺命50问

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  4. LockSupport 详解

    更多内容,前往IT-BLOG LockSupport 用来创建锁和其他同步类的基本线程阻塞原语.简而言之,当调用 LockSupport.park时,表示当前线程将会等待,直至获得许可,当调用 Loc ...

  5. Windows10 穿越火线手感和Windows7不一样

    如果是穿越火线或者其他FPS玩家,应该会感觉Win10和WIin7两者手感会有一定的区别.为什么升级了系统变菜了?心理作用?其实确实和系统有关系哦.我从Windows7升级到Windows10玩穿越火 ...

  6. 【译】使用 ChatGPT 和 Azure Cosmos DB 构建智能应用程序

    原文 | Mark Brown 翻译 | 郑子铭 随着对智能应用程序的需求不断增长,开发人员越来越多地转向人工智能(AI)和机器学习(ML),以增强其应用程序的功能.聊天机器人已经成为提供对话式人工智 ...

  7. VideoPipe可视化视频结构化框架更新总结(2023-3-30)

    项目地址:https://github.com/sherlockchou86/video_pipe_c 往期文章:https://www.cnblogs.com/xiaozhi_5638/p/1696 ...

  8. ServiceAccounts 及 Secrets 重大变化

    关于 ServiceAccounts 及其 Secrets 的重大变化 kubernetes v1.24.0 更新之后进行创建 ServiceAccount 不会自动生成 Secret 需要对其手动创 ...

  9. pysimplegui之元素常用属性

    常用元素参数 您将在几乎所有元素创建调用中看到的一些参数包括: key - 与 window[key].事件和返回值字典一起使用 工具提示tooltip - 将鼠标悬停在元素上,您将获得包含此文本的弹 ...

  10. 隐私安全常用网站备忘#privacy

    在线查询浏览器WebRTC漏洞 地址 个人数据泄露(#包含扣扣和phone,微博等) 地址 最全的隐私保护指南 地址 钟馗之眼 地址 shodan#暗黑版goole搜索引擎(需代理访问) 地址 社工查 ...