目录
rest-framework序列化之Serializer
rest-framework序列化之ModelSerializer
一 , Serializer
1. 为何要用这个?数据库查出来的数据是一个query_set的对象, 使用这个可以将其序列化
2. 如何用
- 导入包
- 自定义一个类,继承
serializers.Serializer
- 在类中写上需要的字段
- 视图函数中将查询到的query_set对象作为参数实例化自定义类
- 数据就在上一步实例化出的对象的data方法中
from rest_framework.views import APIView
from app01 import models
from django.http import JsonResponse
from rest_framework import serializers
自定义类部分
class MySer(serializers.Serializer):
name = serializers.CharField()
price = serializers.CharField()
视图函数
class Books(APIView):
def get(self, request):
books = models.Book.objects.all()
#这里将结果丢给自定义类来实例化,instance为queryset对象,many代表多条数据
res = MySer(instance=books, many=True)
return JsonResponse(res.data, safe=False)
结果
[
{
"name": "红楼梦",
"price": "12.00"
},
{
"name": "西游记",
"price": "13.00"
},
{
"name": "水浒传",
"price": "14.00"
},
{
"name": "三国演义",
"price": "11.00"
}
]
3. 用法详解
a, 给返回的数据重命名, 将name改为bookname
将属性名改为你想要的名字, source指向数据库中对应的字段
bookname=serializers.CharField(source='name')
b. 书与出版社一对多 ,查出书的出版社名字
这里也可以用点将其点出来, 与a一样, 也能重命名
sb = serializers.CharField(source='publish.name')
c. source不但可以指向模型表的字段还可以指向模型表的方法, 效果就是print这个方法的返回值
d. 查出书的出版社的详细信息
SerializerMethodField,可以指定一个方法, 该方法返回出版社详细信息
publish=serializers.SerializerMethodField()
方法名:叫get_字段名,要传参数,参数是:当前book对象
def get_publish(self,book):
book 是当前books里的一个对象
dic={'name':book.publish.name,'email':book.publish.email}
return dic
d. 书籍与作者多对多 , 查出每本书作者的姓名,性别
方式一: 自己取出信息拼出来
authors=serializers.SerializerMethodField()
def get_authors(self,book):
#拿到这本书的所有作者
aus=book.authors.all()
# 拼出一个列表,列表中套字典,每个字典是一个作者
ll=[]
for a in aus:
ll.append({'name':a.name,'sex':a.sex})
return ll
方式二: 再次用这个组件序列化
再定义一个类用来序列化作者信息
class AuthorSerializer(serializers.Serializer):
name = serializers.CharField()
sex = serializers.CharField()
authors=serializers.SerializerMethodField()
def get_authors(self,book):
#拿到这本书的所有作者
aus=book.authors.all()
# 可以继续用序列化类,来处理
auth_ser=AuthorSerializer(aus,many=True)
return auth_ser.data
二, ModelSerializer
这个东西不用像上面那样单个字段的处理, 可以一次性处理多个字段
from app01 import models
class BookSerializer(serializers.ModelSerializer):
# 必须写一个内部类,名字叫Meta
class Meta:
model = models.Book #指定操作的表
fields = '__all__' #取出所有字段
# 还可以取出指定的字段
# fields = ['nid','name']
# 去掉指定的字段
# exclude=['publish','authors']
# 指定深度, 多表操作时指定往里查询几层
# depth = 2
# 没有指定深度时, 作者与出版社查出来的都是id,
# 可以重写对应的字段
publish = serializers.CharField(source='publish.name')
authors=serializers.SerializerMethodField()
def get_authors(self,book):
#拿到这本书的所有作者
aus=book.authors.all()
# 可以继续用序列化类,来处理
auth_ser=AuthorSerializer(aus,many=True)
return auth_ser.data
网友评论