• 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
    
        
    
  • 相关阅读:
    p1012拼数题解
    LeetCode OJ :Unique Binary Search Trees II(唯一二叉搜索树)
    UVA 11827 Maximum GCD
    LightOJ1336 Sigma Function(约数和为偶数的个数)
    LightOJ 1197 Help Hanzo(区间素数筛选)
    LightOJ 1236
    BZOJ3339 Rmq Problem
    COJ983 WZJ的数据结构(负十七)
    LCA的五种解法
    hdu4223(dp)
  • 原文地址:https://www.cnblogs.com/Afrafre/p/12799205.html
Copyright © 2020-2023  润新知