drf 序列化器 serializers.Serializer

Django 里面的序列化其实就是在后端把从数据库中取出来的模型类数据转化成 json 格式传递给前端。相应的反序列化就是把从前端接收到的 json 数据转化成模型类数据再去进行相应的数据库操作。

普通的序列化器继承自 serializers.Serializer,需要自己定义想要序列化的字段,根据数据库中表的字段要求设置相应的字段要求,比如:

class Bookserializers(serializers.Serializer):

 title=serializers.CharField(max_length=32,source="book_title",required=True)

需要传哪些字段就序列化哪些字段,并在序列化器中定义这些字段。这里的语法其实跟在 models.py 中定义数据库表字段的时候很像。

定义完了之后,在相应的 get 或者 post 函数里构建一个序列化器对象:

serializer = BookSerializers(data=request.data,many=False)

其中参数 data 是用来获取反序列化数据的,如果是 get请求则不应该用 data传参,而是用 instance 传参,instance 拿到需要序列化的数据。many 代表要序列化的数据是单个还是集合。

如果是反序列化,接下来就要验证前端传来的数据的合法性,用 is_valid 函数来验证,所有数据合法就 return True,并将验证后的数据存入 serializer.validated_data 变量中,如果数据不合法,即违背了上面定义序列化字段时的字段要求,则会返 return False,并将错误信息存入 serializers.errors 中。代码如下:

if serializer.is_valid():

    serializer.save()  # 下面会讲这个save函数的含义

    return Response(serializer.data)  # 检验成功

else:

    return Response(serializer.errors)  # 检验失败

上面代码中,检验成功之后会返回serializer.data,其实这是属性方法,方法内部所做的处理就是根据之前定义的需要序列化的字段将模型实例(serializer.instance)序列化成json格式返回。这一步才是真正的序列化操作。serializer.data 针对的是serializer.instance进行序列化!!!

 

serializer.save()方法

save方法作用是为了解耦。这个 save 方法其实里面需要自定义 create 和 update 方法,分别代表POST请求和PUT请求对应的操作,这些相应的逻辑根据自己的需求写到自定义的序列化器里面去,比如:

def create(self, validated_data):  # 

   new_book=Book.objects.create(**validated_data)

   return new_book

 

def update(self,instance,validated_data):

 Book.objects.filter(pk=instance.pk).update(**validated_data)

   updated_book=Book.objects.get(pk=instance.pk)

   return updated_book

注意这边的 create 和 update 函数一定要有返回值!!!且返回值赋值给instance实例。这是因为接下来的serializer.data属性方法进行序列化处理的时候,处理对象正是instance实例。如果没有返回值,那么虽然后端数据库更新了,但是前端拿不到更新后的数据,无法确认是否更新成功。

save方法会根据是否传入了instance实例来决定走create方法还是update方法。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

J226300

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值