• 【1120 | Day63】反序列化的验证方式(补充三种)


    验证方式

    再补充定义验证行为,可以使用以下三种方法:

    1)validate_字段名 (局部钩子/value)

    <field_name>字段进行验证,如

    class BookInfoSerializer(serializers.Serializer):
         """图书数据序列化器"""
         ...
         
         def validate_btitle(self, value):
             if 'django' not in value.lower():
         		raise serializers.ValidationError("图书不是关于Django的")
         	 return value
    

    测试

    from booktest.serializers import BookInfoSerializer
    
    data = {'btitle': 'python'}
    serializer = BookInfoSerializer(data=data)
    serializer.is_valid() # False
    serializer.errors
    
    # {'btitle': [ErrorDetail(string='图书不是关于Django的', code='invalid')]}
    

    2)validate (全局钩子/attrs)

    在序列化器中需要同时对多个字段进行比较验证时,可以定义validate方法来验证,如

    class BookInfoSerializer(serializers.Serializer):
         """图书数据序列化器"""
         ...
         def validate(self, attrs):
             bread = attrs['bread']
             bcomment = attrs['bcomment']
             if bread < bcomment:
             	raise serializers.ValidationError('阅读量小于评论量')
             return attrs
    

    测试

    from booktest.serializers import BookInfoSerializer
    
    data = {'btitle': 'about django', 'bread': 10, 'bcomment': 20}
    s = BookInfoSerializer(data=data)
    s.is_valid() # False
    s.errors
    
    # {'non_field_errors': [ErrorDetail(string='阅读量小于评论量', code='invalid')]}
    

    3)validators

    在字段中添加validators选项参数,也可以补充验证行为,如

    def about_django(value):
     	if 'django' not in value.lower():
     		raise serializers.ValidationError("图书不是关于Django的")
     		
    class BookInfoSerializer(serializers.Serializer):
         
         """图书数据序列化器"""
         
         id = serializers.IntegerField(label='ID', read_only=True)
         btitle = serializers.CharField(label='名称', max_length=20, validators=[about_django])
         bpub_date = serializers.DateField(label='发布日期', required=False)
         bread = serializers.IntegerField(label='阅读量', required=False)
         bcomment = serializers.IntegerField(label='评论量', required=False)
         image = serializers.ImageField(label='图片', required=False)
    

    测试

    from booktest.serializers import BookInfoSerializer
    
    data = {'btitle': 'python'}
    serializer = BookInfoSerializer(data=data)
    serializer.is_valid() # False
    serializer.errors
    
    # {'btitle': [ErrorDetail(string='图书不是关于Django的', code='invalid')]}
    
  • 相关阅读:
    hdu 1595(最短路变形好题)
    hdu 5253(最小生成树)
    hdu 2363(枚举+最短路好题)
    hdu 3440(差分约束好题)
    poj 3169&hdu3592(差分约束)
    hdu 3339(最短路+01背包)
    hdu 2145(迪杰斯特拉)
    CodeForces 581D Three Logos
    CodeForces 510E Fox And Dinner
    CodeForces 484D Kindergarten
  • 原文地址:https://www.cnblogs.com/fxyadela/p/11900838.html
Copyright © 2020-2023  润新知