1.普通序列化器
Response是不能直接返回ORM数据的,进行序列化操作,可以通过手动将其转为字典或JSON,也可以使用DRF提供的序列化器,序列化器,
将数据封装为JSON
1.1普通序列化器编写方式
from rest_framework import serializers
1.增删查改对应几个操作?
5个,增加一个数据post,删除一个数据delete,查询所有数据get,查询一个数据get,修改一个数据put。
2.那些操作需要参数,那些操作不需要参数?
不需要参数: 增加一个数据post,查询所有数据get 静态路由
需要参数:删除一个数据delete,查询一个数据get,修改一个数据put 带id的动态路由
3.需要设计几个类视图实现?
2个
1.2.2 普通序列化器序列化
单条数据的序列化
object = models.objects.get(pk=1)
ser_data = Serializer(instance=object)
ser.data # 这就是这一条数据的 JSON 结果
1.2多条数据的序列化
objects = models.objects.all()
ser_data = Serializer(instance=objects, many=True)
ser_data.data # 这就是这一群数据的 JSON 结果
2.普通序列化器反序列化创建
1.反序列化就是把JSON数据变成ORM数据对象
DRF对序列化器仅对数据进行对比。这样才可以获取到数据才可以保存到模型类对象
列化器:
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__'
模型序列化器配置:
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},
# } # 修改原有字段的选项参数
增删查改视图代码:
from rest_framework.views import APIView
from rest_framework.response import Response
from myapp.models import People
from myapp.serializers import PeopleSerializer, PeopleSerializer2
# Create your views here.
class MyView(APIView):
def get(self, request):
print(request.query_params)
return Response({'msg': 'success'}, status=200)
def post(self, request):
print(request.data)
return Response({'msg': 'success'}, status=201)
class PeopleView(APIView):
# 查询所有人物信息
def get(self, request):
people = People.objects.all()
# people是要序列化的数据, many=True多个数据
# 使用序列化器 对数据进行 序列化
ser = PeopleSerializer2(instance=people, many=True)
# 注意:返回的是.data
return Response(ser.data, status=200)
# 增加一个人物信息 反序列化 json数据->ORM格式数据
def post(self, request):
# 使用序列化器进行反序列化,data=request.data要反序列化的数据
ser = PeopleSerializer2(data=request.data)
# 判断反序列化是否成功
# raise_exception=True如果出现异常,会抛出异常
if ser.is_valid(raise_exception=True):
# 保存
ser.save()
# 201添加 或者 修改成功
return Response({'msg': 'success'}, status=201)
return Response({'msg': 'error'}, status=400)
class PeopleView2(APIView):
# 查询一个人物信息
def get(self, request, id):
try:
peo_data = People.objects.get(id=id)
except Exception as e:
print(e)
# 404数据不存在
return Response({'msg': 'error'}, status=404)
# 对ORM操作查询到的数据进行 序列化
ser = PeopleSerializer2(instance=peo_data)
return Response(ser.data, status=200)
# 修改一个人物信息
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)
# 对要更新的数据进行 反序列化
# instance=peo_data,要修改的ORM对象(实例)
# data=request.data, 用于修改ORM对象的数据
ser = PeopleSerializer2(instance=peo_data, data=request.data)
# 判断反序列化是否成功
if ser.is_valid(raise_exception=True):
# 保存
ser.save()
# 201 添加/修改 成功
return Response({'msg': 'success'}, status=201)
return Response({'msg': 'error'}, status=500)
# 删除一个人物信息
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)
3.模型序列化器与普通序列化器的对比
1.序列化:将模型类对象传到instance参数
这样序列化器对象data就可以获取到参数
2.反序列化器:反序列化器的数据传到data参数
反序列化要先使用is_valid对比
3.反序列化更新,更新的数据对象传到instance参数,更新后的数据传到data参数
4.模型序列化器比普通序列化器更加简单,自动生成序列化映射字段,create方法