3.关联对象嵌套序列化
1.1 对关联字段序列化为关联对象的主键: hbook = serializer.PrimaryKeyRelatedField(label='图书',read_only=True)
或者 hbook = serializer.PrimaryKeyRelatedField(label='图书',queryset=BookInfo.objects.all()
read_only参数不能用在反序列化,queryset参数用着反序列化的参数校验
1.2 使用关联对象的序列化器 hbook = BookInfoSerializer()
1.3 关联对象的字符串表达方式 hbook = serializer.StringRelateField(label='图书')
即__str__方法的返回值,即需要在modle.py中重写方法
1.4 (非重点)获取关联对象数据的接口链接
hbook = serializers.HyperlinkedRelatedField(label='图书', read_only=True, view_name='books-detail')
必须指明view_name参数,以便DRF根据视图名称寻找路由,进而拼接成完整URL。
1.5 (非重点)关联对象的指定字段数据(slug_field指明使用关联对象的哪个字段)
book = serializers.SlugRelatedField(label='图书', read_only=True, slug_field='bpub_date')
1.6 (非重点)重写to_representation方法 class BookRelateField(serializers.RelatedField):
def to_representation(self, value):
return 'Book: %d %s' % (value.id, value.btitle)
==============================================反序列化
1. 验证
使用序列化器进行反序列化时,需要对数据调用is_valid()进行验证后,才能获取验证成功的数据或保存成数据类对象
验证失败可以通过序列化对象的errors属性获得错误信息,验证成功,通过序列化对象的validated_data属性获得数据
is_valid()验证时开启raise_exception=True参数,如验证失败抛出serializer.ValidationError异常,REST framework
接收后向前端返回HTTP 404 Bad Request响应
1.1 补充验证 在字段中添加 validator选项参数
def about_django(value):
if 'django' not in value.lower():
raise serializers.ValidationError("图书不是关于Django的")
btitle = serializers.CharField(label='名称', max_length=20, validators=[about_django])
1.2 对
1.3 在序列化器中需要对多个字段进行比较验证时 定义validate方法
def validate(self,attrs):
bcomment = attrs['bcomment']
bread = attrs['bread']
if bcomment > bread:
raise serializer.ValidationError('评论量大于阅读量')
return attrs
2.保存
验证成功后,基于validate_data完成数据对象的创建,可以通过实现create()和update()两个方法实现
class BookInfoSerializer(serializers.Serializer):
...
def create(self,validated_data):
book = BookInfo.objects.create(**validated_dat) validated_data内数据键值拆开传入
return book
def update(self,validated_data):
instance.btitle = validated_data.get('btitle',instance.btitle)
实现上面两种方法后,反序列化数据的时候通过save()方法返回一个数据对象实例
book = serializer.save()
如果创建序列化器对象时, serializer = BookInfoSerializer(instance,data)
book = BookInfo.objects.get(id=2)
data = {'btitle': '倚天剑'}
serializer = BookInfoSerializer(book, data=data)
如果没有传instance参数则调用create(),如果穿instance,data参数则掉用update()
小点:序列化器save()保存时,可额外传递参数,数据可以在create()和update()中的validated_data中得到
serializer.save('name':'laowang')
默认序列化器必传所有required字段,但也可以只传部分,partial = True
===========================================模型类序列化器类ModelSerializer
ModelSerializer与常规的serializer相比:
基于模型类自动生成一系列字段
基于模型类自动为Serializer生成validators
包含默认的create()和update()的实现
创建BookInfoSerializer
class BookInfoSerializer(serializers.ModelSerializer):
class Meta:
models = BookInfo 指明参照哪种模型类
fields = "__all__" 为模型类生成那些字段
或fields = ['btitle','bcomment']
默认ModelSerializer使用主键做关联字段,但使用depth=1生成简单的嵌套
显示指明字段,添加 hbook = BookInfoSerializer() fields = [...'hbook']
指明只读字段 read_only_fields = [字段名]
添加额外字段 extra_kwargs参数为ModelSerializer添加或修改原有的选项参数
extra_kwargs = {
'bread': {'min_value': 0, 'required': True},
'bcomment': {'min_value': 0, 'required': True},
}