当前位置:网站首页>第十一单元 序列化器
第十一单元 序列化器
2022-08-02 14:01:00 【czy1206527605】
一.普通序列化器
1.普通序列化器的编写方式
1. 在自定义应用里创立serializers文件
2.进入文件,编写普通序列化器文件
class PeopleSerializer(serializers.Serializer):
# id = serializers.IntegerField()
name = serializers.CharField(max_length=20)
sex = serializers.CharField(max_length=20)
money = serializers.IntegerField()
ranking = serializers.IntegerField()
PS:id字段为自带字段,在进行增删改操作的时候最好注释掉
二.模型序列化器
1.模型序列化器的编写方式
class PeopleSerializer2(serializers.ModelSerializer):
class Meta:
model = People
fields = '__all__'
2.模型序列化器的使用
将view视图中的普通序列化器名改为模型序列化器名即可
3.模型序列化器的配置
class GoodsSer(serializers.ModelSerializer):
class Meta:
model = Goods
fields = '__all__' # 指明所有模型类字段
# exclude = ('createtime',) # 排除掉的字段
# read_only_fields = ('title','description') # 只用于序列化的字段
# fields = ('title','description','inventory') # 手动指明字段
# extra_kwargs = {
# 'price':{'min_value':0, 'required':True},
# } # 修改原有字段的选项参数
三.普通与模型序列化器对比
- 序列化时,将模型类对象传入instance参数
- 序列化结果使用序列化器对象的data属性获取得到
- 反序列化创建时,将要被反序列化的数据传入data参数
- 反序列化一定要记得先使用is_valid校验
- 反序列化更新时,将要更新的数据对象传入instance参数,更新后的数据传入data参数
- 模型序列化器比普通序列化器更加方便,自动生成序列化映射字段,create方法等
- 关联外键序列化,字段属性外键为多时要记得加many=True
四.视图分析(增删查改操作)
模型类示例
class People(models.Model):
name = models.CharField(max_length=20, verbose_name='姓名')
sex = models.CharField(max_length=5, verbose_name='性别')
money = models.IntegerField(verbose_name='身价')
ranking = models.IntegerField(verbose_name='排名')
class Meta:
verbose_name = '名人表'
verbose_name_plural = verbose_name
db_table = 'people'
def __str__(self):
return self.name
序列化器示例
from rest_framework import serializers
from myapp.models import People
# 普通序列化器
class PeopleSerializer(serializers.Serializer):
# id = serializers.IntegerField()
name = serializers.CharField(max_length=20)
sex = serializers.CharField(max_length=5)
money = serializers.IntegerField()
ranking = serializers.IntegerField()
# 新增数据会调用create方法
def create(self, validated_data):
obj = People.objects.create(
**validated_data
)
# 返回新生成的ORM对象
return obj
# 修改数据需要实现update方法
# instance,要修改的ORM对象(实例)
# validated_data, 用于修改ORM对象的数据
def update(self, instance, validated_data):
instance.name = validated_data.get('name')
instance.sex = validated_data.get('sex')
instance.money = validated_data.get('money')
instance.ranking = validated_data.get('ranking')
instance.save()
# 返回修改后的ORM对象
return instance
# 模型序列化器
class PeopleSerializer2(serializers.ModelSerializer):
class Meta:
# 指定模型类
model = People
# 指定映射字段
fields = '__all__'
操作的分类
- 增加一条数据
- 修改一条数据
- 查找一条数据
- 查找所有数据
- 删除一条数据
PS:其中,235需要参数 14不需要参数。故最少设计两个视图类即可实现
1.查询操作
- 手动序列化查询操作
def get(self,request):
people = People.objects.all()
people_list = [] # 手动序列化
for peo in people:
people_dict = {
'name':peo.name,
'sex':peo.sex,
'money':peo.money,
'ranking':peo.ranking
}
people_list.append(people_dict)
return Response(people_list,status=200)
- 自动序列化查询操作
def get(self,request):
people = People.objects.all()
ser = PeopleSerializer2(people,many=True)
return Response(ser.data,status=200)
- 自动序列化单个查询操作
def get(self,reqeust,id):
try:
peo_data = People.objects.get(id=id)
except Exception as e:
print(e)
return Response({'msg':'error'},status=404)
ser = PeopleSerializer2(peo_data)
return Response(ser.data,status=200)
2.增加操作(反序列化操作)
反序列化 json->ORM格式数据
def post(self,request):
ser = PeopleSerializer2(data=request.data)
if ser.is_valid(raise_exception=True):
ser.save()
return Response({'msg':'success'},status=201)
return Response({'msg':'error'},status=400)
在普通序列化器下运行时新增数据要调用create方法
在普通序列化器下添加
def create(self, validated_data):
obj = People.objects.create(
**validated_data
)
return obj
3.修改操作(反序列化)
def put(self,request,id):
try:
peo_data = People.objects.get(id=id)
except Exception as e:
print(e)
return Response({'msg': 'error'}, status=404)
ser = PeopleSerializer2(instance=peo_data,data=request.data)
if ser.is_valid(raise_exception=True):
ser.save()
return Response({'msg': 'success'}, status=201)
return Response({'msg': 'error'}, status=500)
在普通序列化器下运行时新增数据要调用update方法
在普通序列化器下添加
def update(self, instance, validated_data):
instance.name = validated_data.get('name')
instance.sex = validated_data.get('sex')
instance.money = validated_data.get('money')
instance.ranking = validated_data.get('ranking')
instance.save()
# 返回修改后的ORM对象
return instance
4.删除操作
def delete(self,request,id):
try:
People.objects.filter(id=id).delete()
except Exception as e:
print(e)
# 404数据不存在
return Response({'msg':'error'},status=404)
# 204表示删除成功
return Response({'msg':'success'},status=204)
边栏推荐
- 2022-08-02日报:2022年7月最热的10篇AI论文
- Gstreamer Plugin注册流程详解
- 监管再次重拳出击,后市如何?2021-05-22
- 线代:已知一个特征向量快速求另外两个与之正交的特征向量
- 苏州大学:从 PostgreSQL 到 TDengine
- els 长条方块变形条件、边界碰撞判定
- 配置zabbix自动发现和自动注册。
- A number of embassies and consulates abroad have issued reminders about travel to China, personal and property safety
- Flutter 实现光影变换的立体旋转效果
- 泡利不相容原理适用的空间范围(系统)是多大?
猜你喜欢
瑞吉外卖笔记——第08讲读写分离
如何解决1045无法登录mysql服务器
二分查找 && 树
二极管及其应用
鲲鹏devkit & boostkit
第二届中国Rust开发者大会(RustChinaConf 2021~2022)线上大会正式开启报名
【Tensorflow】AttributeError: '_TfDeviceCaptureOp' object has no attribute '_set_device_from_string'
You can't accept 60% slump, there is no eligible for gain of 6000% in 2021-05-27
Data Organization---Chapter 6 Diagram---Graph Traversal---Multiple Choice Questions
Mysql's case the when you how to use
随机推荐
php开源的客服系统_在线客服源码php
els 长条方块变形条件、边界碰撞判定
Flutter 实现光影变换的立体旋转效果
C# using 使用方法
WiFi Association&Omnipeek抓包分析
rust使用mysql插入数据
网页设计(新手入门)[通俗易懂]
The bad policy has no long-term impact on the market, and the bull market will continue 2021-05-19
MySQL数据库设计规范
Detailed explanation of ORACLE expdp/impdp
GTK:Gdk-CRITICAL **: IA__gdk_draw_pixbuf: assertion ‘GDK_IS_DRAWABLE (drawable)‘ failed
els 长条碰撞变形判断
C# 编译错误:Compiler Error CS1044
Sentinel源码(三)slot解析
云片网案例
Sentinel源码(六)ParamFlowSlot热点参数限流
xshell连接虚拟机步骤_建立主机与vm虚拟机的网络连接
ORACLE expdp/impdp详解
Sentinel源码(四)(滑动窗口流量统计)
Raft协议图解,缺陷以及优化