测试开发进阶(二十六)
欢迎关注我的公众号「测试游记」
序列化器
read_only = True指定该字段只能进行序列化输出write_only = True指定该字段只进行反序列化输入,但不进行序列化输出required该字段在反序列化时必须传入,默认为Truedefault反序列化时使用的默认值allow_null该字段是否允许传入None,默认Falsevalidators该字段使用的校验器error_messages包含错误key与错误信息的字典(下面有例子)label用于HTML展示API页面时,显示的字段名称
选项参数
max_length最大长度min_length最小长度allow_blank是否允许为空trim_whitespace是否截断空白字符max_value最小值min_value最大值
校验
- 调用序列化器对象的
is_valid方法,才开始校验前端参数 - 如果校验成功,则返回
True,校验失败返回False raise_exception=True,校验失败后会抛出异常- 当调用
is_valid方法之后,才可以调用errors属性「校验的错误提示(字典)」
1 | try: |
在序列化器中增加validators
1 | from rest_framework.validators import UniqueValidator |
编写一份创建项目的json
发送一个创建请求
1 | http POST :8000/project/ < projects.json |

自定义校验
自己编写一个校验器
需求:项目名称中必须包含项目关键字
1 | def is_unique_project_name(name): |
1 | name = serializers.CharField( |

单字段校验
在序列化器内部增加def validate_name(self, value):
1 | # 单字段的校验 |
1 | # projects.json |

修改projects.json
1 | # projects.json |

多字段校验
1 | def validate(self, attrs): |

这里name为None是因为上面单字段校验没有返回value
修改后再次测试
1 | def validate_name(self, value): |

1 | def validate(self, attrs): |

修改projects.json
1 | # projects.json |

校验器的顺序
- 字段定义时的限制,包含
validators列表条目从左到右进行校验 - 单字段「
validate_字段名」的校验 - 多字段联合校验「
validate方法」
优化视图内代码
如果在创建序列化器对象时候,只给data传参,那么调用save()方法实际调用的就是序列化器对象的
create()方法在创建序列化器对象时,同时给instance和data传参,那么调用save()方法实际调用的就是序列化器对象的
update()方法
序列化器类ProjectSerializer中增加create和update
1 | def create(self, validated_data): |
修改post请求
从
1 | def post(self, request): |
改为
1 | def post(self, request): |
修改put请求
从
1 | def put(self, request, pk): |
改为
1 | def put(self, request, pk): |
优化序列化器
1 | from rest_framework import serializers |
1 | In[2]:from projects import serializer |

1 | fields = ('id', 'name', 'leader', 'tester', 'programer', 'publish_app') |
fields:指定显示哪些exclude:指定排除哪些read_only_fields:指定read_only=True的字段
如果需要修改name的校验,自定义一个name字段
1 | class ProjectModelSerializer(serializers.ModelSerializer): |
也可以增加extra_kwargs增加其他内容
1 | class Meta: |
测试一下:
1 | Out[3]: |