第十一单元 序列化器

一.普通序列化器

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值