美文网首页
rest_framework之序列化

rest_framework之序列化

作者: aq_wzj | 来源:发表于2018-12-11 17:21 被阅读0次

目录

rest-framework序列化之Serializer

rest-framework序列化之ModelSerializer

一 , Serializer

1. 为何要用这个?数据库查出来的数据是一个query_set的对象, 使用这个可以将其序列化

2. 如何用

  1. 导入包
  2. 自定义一个类,继承serializers.Serializer
  3. 在类中写上需要的字段
  4. 视图函数中将查询到的query_set对象作为参数实例化自定义类
  5. 数据就在上一步实例化出的对象的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

相关文章

网友评论

      本文标题:rest_framework之序列化

      本文链接:https://www.haomeiwen.com/subject/zcuehqtx.html