序列化器Serializer源码分析

Django REST framework中的Serializer使用类来定义,要继承rest_framework.serializers.Serializer
 

-如果想序列化和反序列化都用一个序列化类,可以使用如下俩字段控制
	-read_only	表明该字段仅用于序列化输出,默认False(重点)
	-write_only	表明该字段仅用于反序列化输入,默认False(重点)
    -如果写起来比较麻烦,可以使用两个序列化类,一个序列化,一个反序列化
# source的用法
	name1 = serializers.CharField(source='name')--->意思是name1映射成models中的name
    
    
# 如果继承Serializer类,要修改和保存,一定要重写update和create
	BookSerializer---》Serializer---》BaseSerializer--save的核心代码
         if self.instance is not None:
            self.instance = self.update(self.instance, validated_data)
        else:
            self.instance = self.create(validated_data)
	

序列化类之ModelSerializer(*****)

from .models import Book, Publish


# class PublishModelSerializer(serializers.ModelSerializer):
#     # 指定跟表的对应关系
#     class Meta:
#         model = Publish  # 跟哪个表有关系
#         # fields =['name','addr']
#         # fields ='__all__'  # 所有字段,只序列化字段,不序列化方法
#         fields = ['name', 'addr', 'name_detail']
#         # 给字段类,传递参数、属性
#         extra_kwargs={
#             'addr':{'max_length':8,'min_length':3,'write_only':True},
#             # 'name':{'write_only':True}
#         }
#         # 不重要的
#         # exclude=['name']  # 它跟fields 只能由一个
#         # depth=1
#
#
#     #1 不用重写create和update
#
#     #2  在出版社名字后加 _vip
#     # 方式一
#     # name=serializers.SerializerMethodField()
#     # def get_name(self,obj):
#     #     return obj.name+'_vip'
#
#     # 方式二,在表模型中定义一个name_detail,在fields中写一些字段或方法
#
#     ## 序列化的时候使用name_detail,反序列化的时候使用name
#     # name_detail = serializers.CharField(read_only=True)  如果是个方法,这句可以不写
#     name = serializers.CharField(write_only=True)
#
#
#
#     #3  限制addr,最大长度8,最小长度3

序列化类全局,

# 局部钩子:给某个字段再增加校验(固定用法),定义一个方法,名字为validate_字段名
    def validate_addr(self, item):
        if item.startswith('sb'):
            # 抛异常,不能以sb开头
            raise ValidationError('不能以sb开头')
        else:
            return item

    # 全局钩子
    # 限制出版社的名字不能等于出版社地址
    def validate(self, attrs):
        name = attrs.get('name')
        addr = attrs.get('addr')
        if name == addr:
            raise ValidationError('name和addr不能一样')
        else:
            return attrs

局部钩子(*****)

可以讨论

来自博客园博主:序列化类Serializer 源码分析 及使用 - Aisa - 博客园 (cnblogs.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值