python-关于反序列化及模型类序列化器类

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 对字段进行验证 validator_        validator_btitle
    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},
        }

你可能感兴趣的:(python,django)