drf框架serializers中ModelSerializer类简化序列化和反序列化操作
0905自我总结
drf框架serializers中ModelSerializer类
基于seriallizer类进行简化
https://www.cnblogs.com/pythonywy/p/11455508.html
一.简单的使用
导入from rest_framework import serializers
与基础serializer类后续使用的作用相似
class 自定义名称(serializers.ModelSerializer):
class Meta:
model=对应的模型
fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
#fields='__all__' 为所有字段
# exclude = ('id', 'is_delete') # 刨除某些字段
# depth = 1 # 跨表自动深度(展示外键表的所有字段)
注意点
- 其中
fields与exclude不能共存 depth不能控制显示字段,与外键相关的表会全部显示出来
二.利用模型类中的方法进行指导字典的生成
例如有两个模型A与B,他们的c字段有外键关联
modles.py
class B(models.Model):
name = models.CharField(max_length=60)
class A(models.Model):
uid = models.ForeignKey(B,'id')
@property #下面调用函数名的时候自动运行函数
def b_name(self): #这里的self是A类
return self.uid.name
class AModelSerializer(serializers.ModelSerializer):
class Meta:
model=A #这里导入A会把A里面的所有名称空间存在的都进行导入
fields=('b_name')
三.另外总方法完成深度查询
class B(models.Model):
name = models.CharField(max_length=60)
class A(models.Model):
uid = models.ForeignKey(B,'id')
#方法一
class BModelSerializer(serializers.ModelSerializer):
class Meta:
model=B
fields=('b_name')
class BModelSerializer(serializers.ModelSerializer):
b_name = BModelSerializer()
class Meta:
model=A #这里导入A会把A里面的所有名称空间存在的都进行导入
fields=('b_name')
#方法二
#通过自定义字段
class BModelSerializer(serializers.ModelSerializer):
b_name = serializers.SerializerMethodField()
def get_b_name(self, obj: models.A):
return A.uid.name
class Meta:
model=A #这里导入A会把A里面的所有名称空间存在的都进行导入
fields=('b_name')
四.ModelSerializer对于反序列话约数条件设置及只读只写属性设置
反序列话约数条件设置
class 自定义名称(serializers.ModelSerializer):
class Meta:
model=对应的模型
fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
extra_kwargs ={
参与序列化和反序列的字段1:{
'required': True, #必须填写的字段
'min_length': 3,
#.....约数条件
'error_messages': {
'min_length': '太短'
}
}
}
只读只写属性设置
class 自定义名称(serializers.ModelSerializer):
class Meta:
model=对应的模型
fields=('参与序列化和反序列的字段1','参与序列化和反序列的字段2')
extra_kwargs ={
参与序列化和反序列的字段1:{
'write_only': True #只写
}
参与序列化和反序列的字段2:{
'read_only': True #只读
}
}
五.视图层使用
数据没有修改
class BookAPIView(APIView):
def get(self, request, *args, **kwargs):
book_query = models.Book.objects.all() #假设查我们定义的书的这个模型
book_ser = serializers.BookModelSerializer(book_query, many=True)
return Response(0, 'ok', results=book_ser.data) #用drf框架自带的Response
有添加修改相关操作
class BookAPIView(APIView):
def post(self, request, *args, **kwargs):
pk=kwargs.get('pk')
book_obj = models.Book.objects.get('pk')
book_ser = serializers.BookModelSerializer(instance=book_obj,data=request.data) #根据传进来的数据机芯判断
#如果多个数据为book_set = serializers.BookModelSerializer(data=request.data many=true)
if book_ser.is_valid(): #这里是我们设置的ModelSerializer的约数条件看是否能通过
book_ser.save() #这里他会自动进行判断是create方法还是update方法
return Response(0, 'ok',results=book_ser.data)
else:
return Response(1, '添加失败', results=book_ser.errors)#用drf框架自带的Response
注意点:save源码中我们可以看到instance有值调用updata方法,没有值调用create方法.所以修改必须加instance参数,传的参数基本上是修改之前的对象
有关删除
class BookAPIView(APIView):
def post(self, request, *args, **kwargs):
book_ser = serializers.BookModelSerializer(data=request.data) #根据传进来的数据机芯判断
#如果多个数据为book_set = serializers.BookModelSerializer(data=request.data many=true)
if book_ser.is_valid(): #这里是我们设置的ModelSerializer的约数条件看是否能通过
book_ser.deleter() #这里他会自动进行判断是create方法还是update方法
return Response(0, 'ok',results=book_ser.data)
else:
return Response(1, '删除失败', results=book_ser.errors)#用drf框架自带的Response
drf框架serializers中ModelSerializer类简化序列化和反序列化操作的更多相关文章
- 在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出MethodArgumentNotValidException异常,因此,只需要在ExceptionHandler类中添加处理对应异常的方法即可。
在SpringMVC中,当Json序列化,反序列化失败的时候,会抛出HttpMessageNotReadableException异常, 当Bean validation失败的时候,会抛出Method ...
- JSON数据处理框架Jackson精解第一篇-序列化与反序列化核心用法
Jackson是Spring Boot默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的,没有这种限制.它提供了很 ...
- .Net类的序列化和反序列化 - 进阶者系列 - 学习者系列文章
今天看了下以前的一个工具的代码,其中涉及到.NET类的序列化和反序列化问题,所以就写一下. 这里说一下.NET类序列化的好处..NET类在序列化之前只是一个相对狭义的类.通过序列化,能够更好的保存该类 ...
- C# 类的序列化和反序列化
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通过从存储区中读取或反序列化对象的状态,重新创 ...
- 初识序列化和反序列化,使用BinaryFormatter类、ISerializable接口、XmlSerializer类进行序列化和反序列化
序列化是将对象转换成字节流的过程,反序列化是把字节流转换成对象的过程.对象一旦被序列化,就可以把对象状态保存到硬盘的某个位置,甚至还可以通过网络发送给另外一台机器上运行的进程.本篇主要包括: ● 使用 ...
- C#中json字符串的序列化和反序列化
改文章转自:https://www.cnblogs.com/shang201215019/p/7907655.html 什么是 Json ? Json[javascript对象表示方法] ...
- C#中的Json的序列化和反序列化
Json是一种通用的数据格式,我们在数据交换的时候,经常会用到,下面介绍c#中的json序列化和反序列化,当然也可用在asp.net,silverlight,wpf中.我们在下面实例讲解如何进行Jso ...
- 基于.net core封装的xml序列化,反序列化操作
需求: 由于在.net core中去除了Xml序列化XmlSerializer操作类.因此,在于一此数据传输当中出,需要用到对xml格式字符串的处理问题.因此封装了一个xml序列化与反序列化操作的类库 ...
- java浅克隆和深克隆,序列化和反序列化实现深克隆(封装序列化和反序列化操作)
本篇博客内容: 一.浅克隆(ShallowClone)和深克隆(DeepClone) 二.序列化和反序列化实现深克隆 三.封装序列化和反序列化操作 ObjectOutputStream + 内存流By ...
随机推荐
- Spotlight on Oracle注册码破解(亲测可用)
了解到该工具监控十分强大,该工具优点: 我就是为了监控一个Oracle数据库,查阅各种资料,真是费了十牛二虎之力,才破解完成.#_# 在客户端安装好了,连接监控的服务器,提示得要注册码,这外国的软件基 ...
- android中shape 的使用
android 开发中 对于 shape 和 selector的使用,一直都不是很熟练, 记录一下.便于以后参考. 举个项目中例子图 对于上面的2个radiobutton ,背景我们可以让美工做一个. ...
- Flink入门宝典(详细截图版)
本文基于java构建Flink1.9版本入门程序,需要Maven 3.0.4 和 Java 8 以上版本.需要安装Netcat进行简单调试. 这里简述安装过程,并使用IDEA进行开发一个简单流处理程序 ...
- JVM学习(虚拟机栈、堆、方法区)自我看法
堆(Heap): 此内存区域唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配.这一点在java虚拟机规范中的描述是:所有的对象实例以及数组都要在堆上分配. 虚拟机栈(Stack): 虚拟机栈主 ...
- Python中使用pip安装库时指定镜像源为豆瓣镜像源
场景 在使用pip进行安装库时,使用默认的库会很慢,甚至有时会出现远程主机中断了一个现有连接. 怎样在使用pip install 时指定镜像源为豆瓣镜像源. 实现 pip install moviep ...
- Guava的RateLimiter实现接口限流
最近开发需求中有需要对后台接口进行限流处理,整理了一下基本使用方法. 首先添加guava依赖: <dependency> <groupId>com.google.guava&l ...
- 进击的.NET 在云原生时代的蜕变
你一定看过这篇文章 <进击的 Java ,云原生时代的蜕变>, 本篇文章的灵感来自于这篇文章.明天就将正式发布.NET Core 3.0, 所以写下这篇文章让大家全面认识.NET Cor ...
- 初学Spring的感觉
1.使用接口 不同的类实现同一接口后都会变成同一类型的类. spring作业1的思路 lab1: 建立一个有一个输出方法的接口类|并建一个英语类和一个数学类实现该接口. 这两个实现类都重写了那 ...
- LoadRuuner资源监控
用ipconfig命令查看IP地址的具体方法.初级工程师面试常面临的问题:网址:http://url.cn/5BaDWvB本机IP:172.0.0.1localhostipconfig命令c查看本机I ...
- Servlet防止盗链
在开发过程中有时存在用户直接复制链接,而绕过首页的情况.如果需要用户访问首页,而不是直接访问我们的网页,我们就称为盗链. 在Servlet中通过Request的getHeader()方法获取链接来源, ...