rest_framework序列化组件使用Serializer

注:source 可以指定一个字段名,表模型,还可以指定表模型里的方法,source 指定的如果是方法不用加括号自己执行


1,写一个类继承serializers.Serializer
2,视图层调这个类实例化产生实例化对象
3,注意返回用的是rest_framework 的 Response


from
rest_framework import serializers class BookSerialize(serializers.Serializer): nid = serializers.CharField() # (1)source的用法1:起别名 # name = serializers.CharField(source="name") # source 指定要序列化的字段,不能写两个name author_name = serializers.CharField(source="name") # 相当于给name字段显示起别名为book_name price = serializers.CharField() # (2)source的用法2:可以指定表模型 # publish = serializers.CharField() # 可以利用__str__ 显示序列化 # publish = serializers.CharField(source="publish.name") # source可以指定表模型 # (3)source的用法3:指定表模型的方法,相当于直接触发序列化表里的方法执行 # xx = serializers.CharField(source="test") # source可以指定表模型的方法,将该返回值的结果赋值给xx 相当于给表模型添加字段 # rest_framework组件之SerializerMethodField 的方法使用,写一个get+字段名的函数 authors = serializers.SerializerMethodField() def get_authors(self, obj): # obj为序列化的对象 author_list = obj.authors.all() ser = AuthorSerialize(author_list, many=True) return ser.data # 返回的结果为序列化打印的对象 视图层: from rest_framework.views import APIView from rest_framework.response import Response from app01.myserialize import BookSerialize class Books(APIView): def get(self, request, *args, **kwargs): response = {"status": 100, "msg": "查看所有"} all_author = Author.objects.all() # 产生序列化的对象 ser = BookSerialize(all_author, many=True) # many=True 表示序列化多条 many=False 表示序列化单条 response["data"] = ser.data # 序列化以后的数据在data里 return Response(response)

 

rest_framework序列化组件使用ModelSerializer

1,写一个类继承ModelSerializer
2,视图层调这个类实例化产生实例化对象
3,注意返回用的是rest_framework 的 Response

from rest_framework import serializers
class BookSerialize(serializers.ModelSerializer):
    class Meta:
        model = models.Author
        # fields = ["name",]   # 指定序列化哪些字段
        fields = '__all__'  # 序列化所有字段 一般不用
        # exclude = ["name", ]  # 排除那些字段不显示,不与查询所有连用
        # depth=1  指定查询的深度

    publish=serializers.CharField(source='publish.name')   # 源信息连表显示的是字段id 所以重写序列化字段

视图层: from rest_framework.views import APIView from rest_framework.response import Response from app01.myserialize import BookSerialize class Books(APIView): def get(self, request, *args, **kwargs): response = {"status": 100, "msg": "查看所有"} all_author = Author.objects.all() # 产生序列化的对象 ser = BookSerialize(all_author, many=True) # many=True 表示序列化多条 response["data"] = ser.data # 序列化以后的数据在data里 return Response(response)

rest_framework系列化组件 之 局部钩子 全局钩子

注:rest_framework 钩子函数源码 从  is_valid 入口

语法: validate + 校验字段名

from rest_framework.exceptions import ValidationError
class BookSerialize(serializers.ModelSerializer):
    class Meta:
        model = models.Author
        fields = '__all__'  # 序列化所有字段 一般不用

     # 局部钩子
    def validate_name(self,value):
        if value.startswith("sb"):
                raise ValidationError("不能以sb开头")
        return value

    # 全局钩子  所有字段校验通过
    def validate(self, value):
        name = value.get("name")
        price = value.get("price")
        if name != price:
            raise ValidationError("书与价格不能比较")
        return value

 

rest_framework系列化组件 之 数据保存校验功能

from rest_framework.exceptions import ValidationError
class BookSerialize(serializers.ModelSerializer):
    class Meta:
        model = models.Author
        fields = '__all__'  # 序列化所有字段 一般不用



# 视图层
from rest_framework.views import APIView
class Books(APIView):
   
    def post(self, request):   # 添加一条数据
         print( request.data )
    
        response = {"status": 100, "msg": "插入成功"}
        try:
            book_ser = BookSerialize(data=request.data)
            if book_ser.is_valid():    # 数据校验,查看钩子源码入口 is_valid 进入
                book_ser.save()   # 修改数据库
                response['data'] = book_ser.data
            else:
                response['msg'] = book_ser.errors
        except Exception as e:
            response['msg'] = str(e)
        return Response(response)


图书增删改查 rest_framework 接口

 

版权声明:本文为liu--huan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liu--huan/p/10606980.html