drf序列化用APIView写编写5个接口并校验数据

  • 步骤:
    • 写一个类,继承Serialier
    • 在类中写字段,字段就是要序列化的字段
    • 在视图函数中,序列化类,实例化得到对象,传入该传的参数
    • 调用序列化类对象的 serializer.data 方法完成序列化

【一】写序列化类

  • serializer.py
from rest_framework import serializers
from rest_framework.exceptions import ValidationError


class BookSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=8, min_length=3)
    price = serializers.IntegerField(max_value=100, min_value=10)

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

    # 全局钩子
    def validate(self, attrs):
        # attrs是字典
        name = attrs.get('name')
        price = attrs.get('price')
        if name.startswith('sb') and price > 50:
            raise ValidationError('书名不能以sb开头,价格不能超过50')
        else:
            return attrs


【二】后端

from .serializer import BookSerializer
from rest_framework.response import Response
class BookView(APIView):
    def get(self, request):
        obj_list = Book.objects.all()
        # 多条数据many=True
        serializer = BookSerializer(instance=obj_list,many=True)
        return Response({'code': 100, 'msg': "查询成功", 'results': serializer.data})
    # 增加
    def post(self, request):
        # 校验数据
        serializer=BookSerializer(data=request.data)
        if serializer.is_valid():
            # Book.objects.create(name=request.data.get('name'), price=request.data.get('price'))
            return Response({'code': 100, 'msg': "保存成功"})
        else:
            return Response({'code': 101, 'msg':"保存失败", 'results': serializer.errors})


class BookDetailView(APIView):
    def get(self, request, pk):
        obj = Book.objects.filter(pk=pk).first()
        serializer = BookSerializer(instance=obj)
        return Response({'code': 100, 'msg': "查询成功", 'results':serializer.data})

    # 修改
    def put(self, request, pk):
        Book.objects.filter(pk=pk).update(name=request.data.get('name'), price=request.data.get('price'))
        return JsonResponse({'code': 100, 'msg': "修改成功"})

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

【三】测试

image-20240411194115343

【四】校验

image-20240411200936024
posted @ 2024-04-17 22:06  -半城烟雨  阅读(13)  评论(0编辑  收藏  举报