美文网首页
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