前戏

在之前我们对前端妹子传来的数据进行校验,使用的是序列化类来进行校验的,但这里面往往满足不了我们的需求,更多的时候我们希望自己定义校验规则。这里介绍三种自定义校验的方式。分别是单一字段校验,多个字段校验,还有就是自定义校验

单一字段校验

在序列化器BookSerializer自定义一个方法

class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False) # 只序列化,不走校验
title = serializers.CharField(max_length=32, validators=[my_validate])
pub_time = serializers.DateField()
category = serializers.CharField(source="get_category_display", read_only=True) # 只序列化用
# 因为前端传的是数字,所以需要重写
post_category = serializers.IntegerField(write_only=True) # 只反序列化用 publisher = PublisherSerializer(read_only=True) # 一对多的表 只序列化用
authors = AuthorSerializer(many=True, read_only=True) # 多对多的表需要指定many=True 只序列化用 publisher_id = serializers.IntegerField(write_only=True) # 只反序列化用
author_list = serializers.ListField(write_only=True) # 只反序列化用 def create(self, validated_data):
。。。 def validate_title(self, value): # 对单一字段校验
if "BDYJY" not in value.upper():
return value
raise serializers.ValidationError('标题里含有非法字符') # 抛出错误
validate_字段名,这里validate_title,表示只对title字段进行校验,其他的字段不校验

这样当我们传的值有bdyjy时会提示非法,如下

多个字段校验

上面的校验是校验某一个字段的,有时候我们想校验多个字段,这时候就要用到validate这个方法了

class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False) # 只序列化,不走校验
title = serializers.CharField(max_length=32)
pub_time = serializers.DateField()
category = serializers.CharField(source="get_category_display", read_only=True) # 只序列化用
# 因为前端传的是数字,所以需要重写
post_category = serializers.IntegerField(write_only=True) # 只反序列化用 publisher = PublisherSerializer(read_only=True) # 一对多的表 只序列化用
authors = AuthorSerializer(many=True, read_only=True) # 多对多的表需要指定many=True 只序列化用 publisher_id = serializers.IntegerField(write_only=True) # 只反序列化用
author_list = serializers.ListField(write_only=True) # 只反序列化用 def create(self, validated_data):
... def validate(self, attrs): # 对多个字段校验
# attrs是一个字典,里面是传过来的所有字段
if 'python' in attrs['title'].lower() and attrs['post_category']==1:
return attrs
else:
raise serializers.ValidationError('传的参数有误,请重新上传')

结果:

自定义校验

上面的两种校验要么是单一字段校验,要么是所有字段校验,但更多的时候,我们是想让某些字段校验这个,某些字段校验那个,这时候,就要用到自定义校验了

前面的两种校验都是写在序列化器类里面的,自定义校验要写在序列化类外面,哪个字段想用就写上validators参数,里面是一个列表,放自定义的方法名

def my_validate(value):  # 自定义校验
if "sb" in value.lower():
raise serializers.ValidationError('有脏话')
return value

在序列化器里

class BookSerializer(serializers.Serializer):
id = serializers.IntegerField(required=False) # 只序列化,不走校验
title = serializers.CharField(max_length=32, validators=[my_validate]) # validators里传的是一个列表,里面的是自定义的方法名
pub_time = serializers.DateField()
category = serializers.CharField(source="get_category_display", read_only=True) # 只序列化用

这样哪个字段需要使用自定义的校验规则了就给哪个字段加上validators参数,里面放上要校验的方法名就可以了

最新文章

  1. 一款强大的Android网络渗透软件dsploit
  2. js 事件冒泡
  3. VS2010如何使用Visual Studio Online在线服务管理团队资源(在线TFS)
  4. PHP面向对象——静态属性和静态方法
  5. Spark服务启动的一些总结
  6. 重构6-Push Down Field(字段下移)
  7. Git CMD - push: Update remote refs along with associated objects
  8. poco异步等待ActiveResult
  9. 单点登录SSO原理
  10. Android之TextureView浅析
  11. php获取mac用于网站绑定服务器
  12. sqlserver内存释放
  13. salesforce 零基础学习(六十七)SingleEmailMessage 那点事
  14. 基于Android P系统对selinux相关整理
  15. HTML Table to Json
  16. 检测到是移动端还是PC端进入页面,加载不同样式表现
  17. 数据库---初识sql语句
  18. 实用SQL大全
  19. WPF编程,窗口保持上次关闭时的大小与位置。
  20. Apache Kudu as a More Flexible And Reliable Kafka-style Queue

热门文章

  1. SQL Server 移位运算符
  2. php获取url中的参数
  3. Selenium+java - 关于富文本编辑器的处理
  4. 跟着高淇学Python——第一到第三章总结
  5. javascript在数组的循环中删除元素
  6. du 配合sort查看文件夹大小
  7. solidity智能合约如何判断mapping值为空
  8. 做一个vue轮播图组件
  9. 程序员编程时常用的mac快捷方式
  10. PeriscopeHeartAnimation