单表序列化与反序列化

在我们写APIView的五个接口时,做序列化的时候方法很笨,要写很多代码,这时,我妈可以借助drf提供的序列化类

它可以帮我们:

  • 快速地序列化
  • 做反序列化之前的数据校验
  • 做反序列化

序列化类 Serialier

那么,我们该如何做呢?

1.我们需要写一个类,继承Serialier

2.在类中写字段,字段就是要序列化的字段

3.在视图函数中,序列化类,实例化得到对象,传入该传的参数

4.调用序列化类对象的serializer.data方法完成序列化

如同,操作成功

校验数据

想要校验数据(判断字符长度,判断数字大小......),则需要在继承了Serialier的类里面增加参数:

然后在视图层里进行判断is_value()

ps小知识,要想错误提示换成中文,我们需要在setting.py里面修改数据:

也可以自己在继承了serializer的类里添加钩子函数,做自己想要的校验:

局部钩子函数(书名不能以sb开头)

全局钩子函数(书名和出版社名不能一样)

如果同一个字段局部钩子函数写了多个,只会最后一个生效。

反序列化保存

想要反序列化保存,可以用到serializer.save(),但是仅仅这样是不行的,需要在继承了serializer的类中重写create,修改也是如此:

代码如下:

serializer.py:

from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from .models import Book
class BookSerializer(serializers.Serializer):
    name = serializers.CharField(min_length=3, max_length=8)
    price = serializers.IntegerField(min_value=0, max_value=100)
    publish = serializers.CharField()

    def validate_name(self, name):
        if name.startswith('sb'):
            raise ValidationError('书名不能以sb开头')
        else:
            return name

    def validate(self, attrs):
        if attrs.get('name') == attrs.get('publish'):
            raise ValidationError('书名不能与出版社相同')
        else:
            return attrs

    def create(self, validated_data):
        # validated_data: 前端传入,所有校验通过的数据都是字典
        book = Book.objects.create(**validated_data)
        return book

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name')
        instance.price = validated_data.get('price')
        instance.publish = validated_data.get('publish')
        instance.save()
        return instance

views.py:

from django.http import JsonResponse
# Create your views here.
from django.views import View
from .models import Book
from rest_framework.views import APIView
from .serializer import BookSerializer
from rest_framework.response import Response
class BookView(APIView):
    def get(self, request):
        obj_list = Book.objects.all()
        # 要序列化的queryset对象,但是如果是多条数据,必须加many=True
        serializer = BookSerializer(instance=obj_list, many=True)
        return JsonResponse({'code': 100, 'msg': '查询成功', 'results': serializer.data})

    def post(self, request):
        serializer = BookSerializer()
        if serializer.is_valid():
            serializer.save()
            return JsonResponse({'code':100, 'msg':'添加成功'})
        else:
            return JsonResponse({'code': 101, 'msg': serializer.errors})


from urllib.parse import unquote
class BookDetailView(View):
    def get(self, request, pk):
        obj = Book.objects.filter(pk=pk).first()
        serializer = BookSerializer(instance=obj)
        return JsonResponse({'code': 100, 'msg': '查询成功', 'results': serializer.data})

    def delete(self, request, pk):
        Book.objects.filter(pk=pk).delete()
        return JsonResponse({'code':100, 'msg':'删除成功'})


    def put(self, request, pk):
        obj = Book.objects.filter(pk=pk).first()
        # 改对象必须传data和instance
        serializer = BookSerializer(instance=obj, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response({'code': 100, 'msg': '修改成功'})
        else:
            return Response({'code': 101, 'msg': serializer.errors})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值