Django REST Framework--序列化
一、功能
负责对象和Json格式的相互转换
- 获取数据:对象---->Json返回给前端
- 添加、修改---->对象 存储在数据库中
二、方法
- 基本用法
#新建序列化文件
from rest_framework import serializers
from .models import 库名
#对应数据库序列化
class 库名Serializer(serializers.ModelSerializer):
class Meta:
model=库名
fields="__all__"
- 有外键的用法
from rest_framework import serializers
from .models import 数据库名
from 其它库名Serializer_path import 其它库名Serializer
#对应数据库序列化
class 库名Serializer(serializers.ModelSerializer):
其它库名Serializer()
class Meta:
model=数据库名
fields="__all__"
#其它库名是数据库名外键
#访问就是键名.小写其它库名.字段名
注:保存时会其它库名Serializer反序列化
解决的办法是重写create、update函数(create、update函数要在视图中写)
以下代码要在视图中写
from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework import status
from .models import 数据库名
from .serializer import 库名Serializer
class 库名ViewSet(ModelViewSet):
queryset = 库名.objects.all()
serializer_class = 库名Serializer
#添加方法(执行post请求)
def create(self,request,*args,**kwargs):
#接收前端数据
rec = request.data
#用rec.get('传过来json数据的key')
try:
数据库名.objects.create(field=rec.get('key')....)
return Response({'msg':'添加成功'},status= status.HTTP_201_CREATED)
except Exception as e:
return Response({'error':'添加失败%s'%e},status=status.HTTP_400_BAD_REQUEST)
#修改方法(包含有put、patch两种请求)
def update(self,request,*args,**kwargs):
#接收前端数据
rec = request.data
#用rec.get('传过来json数据的key')
try:
数据库名.objects.filter(id=kwargs.get('id')).update(field=rec.get('key')....)
#update可以是多个傎,也可以是部分值。
#可以是1.field=value...
#2. **rec(对字典解析)
return Response({'msg':'修改成功'},status= status.HTTP_201_CREATED)
except Exception as e:
return Response({'error':'修改败%s'%e},status=status.HTTP_400_BAD_REQUEST)
- 其它知识点
-
模型序例化
fields = (字段列表) exclude = (字段列表) fields = "__all__" read_only_fields = (字段列表)
要在class Meta:中写以上代码
from rest_framework import serializers
from .models import 数据库名
#对应数据库序列化
class 库名Serializer(serializers.ModelSerializer):
库中的字段=其它库名Serializer()
class Meta:
model=数据库名
fields="__all__"
#其它库名是数据库名外键
#访问就是键名.小写其它库名.字段名
#extra_keargs = {
'field':{"read_only":True}
}
#作用:post提交时不能提交,但序列化时会返回值。
三、序列化与反序列化的运行机理
- 序列化
序列化有两个类sexializer、Modelsevializer
一、serialiver是要自己写字段
多–instence =qweryset–many=True
一个–nscane=Obj–many=Fals
返回
serialiver.data
- 多字典列表
- 一个字典
data函数才是真正的序列的过程
instance是django的数据对象,使用data函数后才变成字典的
二.Moddsorialize与数据库里相关
Modelsevializer
dass meta:
model=棋型类名
fiolds=[字段列表] | "all"所有字段
exlude = [字段列表]
注fiecds、elude只能用一个
三、反序列化.
- 接收前端数据.
request.data →是serializer处理后返回的字典列表(字典)
reguest.user→是serializer处理后返回用户信息
regwese.owth→是serializer处理后返回用户信息,但代有token - 反序列化
① serialiver(data=reguest.data)
注:instanee是序列化,data是反序列化.
②对一个对象反序列化
Serializer(instance=obj,data=request.data)
③验证(验证传过来的数据是否有效)
④sorializor.is_valid()
- 错误 serialiver.errors
- 正确 serializer.validated_deta
保存(写入数据库的过程)
(
smrializer.save() - update() →添加
- create()→增加
关键性代码:类. objects.filter( …).updare(**seiadizer.validated-data)→近回更新条数