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)