iphone做网站服务器,基于网站的app开发,拼多多网站建设,wordpress中文分享插件1.3.3 模型类序列化器
如果我们想要使用序列化器对应的是Django的模型类#xff0c;DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。
ModelSerializer与常规的Serializer相同#xff0c;但提供了#xff1a;
基于模型类自动生成一系列…1.3.3 模型类序列化器
如果我们想要使用序列化器对应的是Django的模型类DRF为我们提供了ModelSerializer模型类序列化器来帮助我们快速创建一个Serializer类。
ModelSerializer与常规的Serializer相同但提供了
基于模型类自动生成一系列字段基于模型类自动为Serializer生成validators比如unique_together包含默认的create()和update()的实现
1.3.3.1 定义
比如我们创建一个BookInfoSerializer
class BookInfoSerializer(serializers.ModelSerializer):图书数据序列化器class Meta:model BookInfofields __all__model 指明参照哪个模型类fields 指明为模型类的哪些字段生成
我们可以在python manage.py shell中查看自动生成的BookInfoSerializer的具体实现 from booktest.serializers import BookInfoSerializerserializer BookInfoSerializer()serializer
BookInfoSerializer():id IntegerField(labelID, read_onlyTrue)btitle CharField(label名称, max_length20)bpub_date DateField(allow_nullTrue, label发布日期, requiredFalse)bread IntegerField(label阅读量, max_value2147483647, min_value-2147483648, requiredFalse)bcomment IntegerField(label评论量, max_value2147483647, min_value-2147483648, requiredFalse)image ImageField(allow_nullTrue, label图片, max_length100, requiredFalse)1.3.3.2 指定字段
\1) 使用fields来明确字段__all__表名包含所有字段也可以写明具体哪些字段如
class BookInfoSerializer(serializers.ModelSerializer):图书数据序列化器class Meta:model BookInfofields (id, btitle, bpub_date)\2) 使用exclude可以明确排除掉哪些字段
class BookInfoSerializer(serializers.ModelSerializer):图书数据序列化器class Meta:model BookInfoexclude (image,)\3) 显示指明字段如
class HeroInfoSerializer(serializers.ModelSerializer):hbook BookInfoSerializer()class Meta:model HeroInfofields (id, hname, hgender, hcomment, hbook)\4) 指明只读字段
可以通过read_only_fields指明只读字段即仅用于序列化输出的字段
class BookInfoSerializer(serializers.ModelSerializer):图书数据序列化器class Meta:model BookInfofields (id, btitle, bpub_date bread, bcomment)read_only_fields (id, bread, bcomment)1.3.3.3 添加额外参数选项
我们可以使用extra_kwargs参数为ModelSerializer添加或修改原有的选项参数
class BookInfoSerializer(serializers.ModelSerializer):图书数据序列化器class Meta:model BookInfofields (id, btitle, bpub_date, bread, bcomment)extra_kwargs {bread: {min_value: 0, required: True},bcomment: {min_value: 0, required: True},}# BookInfoSerializer():
# id IntegerField(labelID, read_onlyTrue)
# btitle CharField(label名称, max_length20)
# bpub_date DateField(allow_nullTrue, label发布日期, requiredFalse)
# bread IntegerField(label阅读量, max_value2147483647, min_value0, requiredTrue)
# bcomment IntegerField(label评论量, max_value2147483647, min_value0, requiredTrue)1.4 局部全局校验源码分析
#is_valid----self.run_validation-(执行Serializer的run_validation)--self.to_internal_value(data)---执行Serializer的run_validation485行1.5 序列化组件源码分析
序列化组件先调用__new__方法如果manyTrue生成ListSerializer对象如果为False生成Serializer对象
序列化对象.data方法--调用父类data方法---调用对象自己的to_representation自定义的序列化类无此方法去父类找
Aerializer类里有to_representation方法for循环执行attribute field.get_attribute(instance)
再去Field类里去找get_attribute方法self.source_attrs就是被切分的source然后执行get_attribute方法source_attrs
当参数传过去判断是方法就加括号执行是属性就把值取出来