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')]}
    
  • 相关阅读:
    [转] 浅谈 C++ 中的 new/delete 和 new[]/delete[]
    [转] dpkg-deb命令
    [转] 将DOS格式文本文件转换成UNIX格式
    STM32与FreeRTOS实现低功耗
    设置Beyond Compare 为 Git 默认的比较工具
    [转]Linux进程间通信——使用消息队列
    还你一个自由、干净的网络环境
    Linux下的Hello world
    Cortex-M3中C与汇编的交互
    数据结构25:矩阵转置算法(三元组顺序表)
  • 原文地址:https://www.cnblogs.com/fxyadela/p/11900838.html
Copyright © 2011-2022 走看看