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

    
原文地址:https://www.cnblogs.com/Afrafre/p/12799205.html