zoukankan      html  css  js  c++  java
  • 【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')]}
    
  • 相关阅读:
    【LeetCode】-- 73. Set Matrix Zeroes
    (第三场) A PACM Team 【dp,五维背包】
    POJ 1745 【0/1 背包】
    (第三场) H Diff-prime Pairs 【数论-素数线性筛法+YY】
    POJ 2299 【树状数组 离散化】
    树状数组 && 线段树应用 -- 求逆序数
    HDU 1698 【线段树,区间修改 + 维护区间和】
    HDU 1166 【线段树 || 树状数组,单点修改 维护区间和】
    (第二场)D Money 【dp贪心】
    (第二场)A Run 【动态规划】
  • 原文地址:https://www.cnblogs.com/fxyadela/p/11900838.html
Copyright © 2011-2022 走看看