zoukankan      html  css  js  c++  java
  • DRF_序列化

    Django 内置的serializers( 对象转成json数据)

    rest_framework 序列化

    1. 继承 Serializers
    1. 单独新建py文件, 写一个类继承Serializers
    2. 在类中写要序列化的字段
       from rest_framwork.serializers import Response
       class BookSerializer(serializer.Serializer):
       		1.#以下两种方式都可,序列化出来的key 不一样
       		name = serializers.CharField()
       		title = serializers.CharField(source='name')
       		2.# 外键, 序列化出来的是name
       		publish = serializers.CharFidld(source='publish.name')
       		3.# source 不但可以指定字段,还可以指定表模型的方法,得到方法的返回值给xx
       		xx = sserializers.CharField(source='test')
            
            # 返回出版社所有信息, 方法的返回值赋给
            publish = serializers.SerializerMethodField()
            def get_publish(self,obj):   # get_字段名
                return {'id':obj.publish.pk,'name':publish.name}
            
            # 所有的作者详情,多对多, 可以再写一个AuthorSrializer类
            authors = serializers.SerializerMethodField()
            def get_authors(self,obj):
                author_list = Author.objects.all()
                author_ser=AuthorSerializer(author_list,many=True)
                return author_ser.data
            
    小结:
    rest_framework 序列化 Serializer
        1. 单独新建py文件, 写一个类继承Serializers
        2. 在类中写要序列化的字段
        	source的三种用法:
            指定字段,指定方法,跨表深度查询
        3. SerializerMethodField , 配合方法使用, get_字段名(self,obj) 
           SerializerMethodField对应方法中可以继续使用其他的序列化类
        4. views.py 中
        	book_ser = BookSerializer(book_list,many=True)
            book_ser.data  # 序列化过后的数据
    

    继承 ModelSerializer --- 直接指定要序列化的表模型

    class BookSerializer(serializers.ModelSerializer):
    
        class Meta:  # 内部类
            # 指定要序列化book表
            model = models.Book
            # 选择要序列化的字段
            # fields = ['nid','name']
            # 序列化所有的字段
            fields = '__all__'
            # 深度, 官方建议10, 建议最多3,默认是0
            #
            depth = 1
            # 选择不需要显示的字段,不能和fields连用
            # exclude=['name']
            
    # ---------------------以上是显示所有信息,以下是自定义显示的内容------------------
    
        # 本来publish 所有内荣都显示,现在只显示name
        # publish = serializers.CharField(source='publish.name')
        # 出版社的详细信息
        publish = serializers.SerializerMethodField()
        def get_publish(self,obj):  # obj就是那个当前要序列化的对象
            return {'id':obj.publish.pk,'name':obj.publish.name}
    
        # 5. 多对多,所有的作者详情展示出来 author_ser.data 赋值给authors
        authors = serializers.SerializerMethodField()
        def get_authors(self,obj):  # obj 是要序列化的book
            author_list = obj.author.all()  # 中间相当于一个for循环
            # print(author_list)
            # < QuerySet[ < Author: egon >, < Author: liu >] >
            # < QuerySet[ < Author: liu >] >
            # 实例化一个作者的序列化对象
            author_ser = AuthorSeriliazer(author_list,many=True)
            return author_ser.data
        
        
        #局部钩子校验, 只要是Book 的字段均可以进行局部校验
        def validate_name(self,value):   # value 就是name字段的值
            if value.startswith('sb'):
                raise ValidationError('书名不能以sb开头!')
            else:
                return value
    
        #全局钩子校验
        def validate(self,attrs):  # 所有的都传过来
            # OrderedDict([('name', 'php'), ('price', Decimal('33.00')), ('publish_date', datetime.date(2019, 3, 18)),
            #              ('publish', < Publish: 北京出版社 >), ('author', [ < Author: liu >])])
            print(attrs)  #是一个字典, 是所有属性的键值对
    
            return attrs
        
        
    小结:
    rest_framework 序列化之 ModelSerializer
    class BookSerializer(serializers.ModelSerializer):
        1. 类内部
        class Meta:
            model=models.Book
            fields='__all__'
            # exclude=['name','price']
            depth = 1
    
        
    
  • 相关阅读:
    BNU 51002 BQG's Complexity Analysis
    BNU OJ 51003 BQG's Confusing Sequence
    BNU OJ 51000 BQG's Random String
    BNU OJ 50999 BQG's Approaching Deadline
    BNU OJ 50998 BQG's Messy Code
    BNU OJ 50997 BQG's Programming Contest
    CodeForces 609D Gadgets for dollars and pounds
    CodeForces 609C Load Balancing
    CodeForces 609B The Best Gift
    CodeForces 609A USB Flash Drives
  • 原文地址:https://www.cnblogs.com/Afrafre/p/12799205.html
Copyright © 2011-2022 走看看