测试开发进阶(二十六)
欢迎关注我的公众号「测试游记」
序列化器
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]: |