第十一单元 序列化器

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方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值