字段选项

通用参数

参数名称 说明
read_only 表明该字段仅用于序列化输出,默认False
write_only 表明该字段仅用于反序列化输入,默认False
required 表明该字段在反序列化时必须输入,默认True
default 反序列化时使用的默认值
label 用于HTML展示API页面时,显示的字段名称
allow_null 表明该字段是否允许传入None,默认是False

选项参数

参数名称 作用
max_length 最大长度
min_lenght 最小长度
allow_blank 是否允许为空
max_value 最大值
min_value 最小值

在序列化器中,定义的字段选项默认是required。

class BookInfoSerializer(serializers.Serializer):
    """图书数据序列化器"""
    id = serializers.IntegerField(label='ID')
    name = serializers.CharField(label='名称')
    pub_date = serializers.DateField(label='发布日期')
    readcount = serializers.IntegerField(label='阅读量')
    commentcount = serializers.IntegerField(label='评论量')

如果我们传递数据缺失一个id会怎么样呢?

>>> from book.serializers import BookInfoSerializer
>>> 
>>> data = {
...     'name':'Python高级',
...     'pub_date':'2020-01-01',
...     'readcount':100,
...     'commentcount':200
... }
>>> 
>>> serializer = BookInfoSerializer(data=data)
>>> 
>>> serializer.is_valid(raise_exception=True)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/ubuntu/.virtualenvs/py3_django_2_2_5/lib/python3.6/site-packages/rest_framework/serializers.py", line 242, in is_valid
    raise ValidationError(self.errors)
rest_framework.exceptions.ValidationError: {'id': [ErrorDetail(string='This field is required.', code='required')]}
>>>

read_only

像id这样的主键值,一般我们都是让数据库自动生成,所以一般不会传入。则需要设置为 read_only

id = serializers.IntegerField(label='ID',read_only=True)

write_only

只写入。我们在进行反序列化的时候,必须要求传入该字段。在进行序列化操作的时候不会获取到该字段的值。

password = serializers.IntegerField(label='密码',read_only=True)

read_only=True

write_only=True

id = serializers.IntegerField(label='ID',read_only=True)    表明该字段仅用于序列化输出

password = serializers.IntegerField(label='ID',write_only=True)   表明该字段仅用于反序列化输入

read__only和write__only会一起出现吗?值不一样呢?