这一节我们聊聊 rest_framework 序列化器的字段和参数的一些问题,所有的序列化字段都继承 rest_framework.fields 模块,其中最基础的就是 Field 类,首先我们聊聊该类的参数和一些基本方法的作用:
1:Field 核心参数
(1)read_only
只读字段,表示只支持序列化,只在API输出中 ;而不能反序列化(设置True),即在创建或更新操作期间不应包含在输入中,如果将该字段包含在序列化器输入中所有read_only字段都将被忽略,不会保存到数据库里。
默认值为False,请注意:不能同时设置write_only=True,在序列化时,所有非 write_only=True 的字段都会被输出;也不能同时设置required=True。此外,如果一个模型对象没有某个字段,那么你在序列化器中写了该字段(必须置:read_only=True),在序列化时不会输出。
(2)write_only
进行设置True以确保在更新或创建实例时可以使用该字段,但在序列化表示形式时不包括该字段。
请注意:不能同时设置read_only=True ,在反序列化时,所有非 read_only=True d\的字段都会被保存到数据库中
(3)required
在序列化时,required无论是False或True,都没有影响。
在反序列化时,如果设置False,如果不包含该字段,字段对应的模型字段写入数据库时,采用模型字段的默认值;如果包含该字段,那么以实际填入该字段的值写入数据库;如果设置True,不包含该字段时,序列化器在 is_valid 时会验证错误。
默认值True,请注意:设置True时, 不能与default参数同时使用。
(4)allow_null
默认值为False。
如果将None值赋值给该字段,通常会引发错误。将此关键字参数设置为True,None被视为有效值。
(5)default
如果设置:则给出默认值,如果没有提供输入值,该默认值将用于该字段。如果未设置:则默认行为是根本不填充该属性。该default过程中部分更新操作不适用。在部分更新的情况下,仅传入数据中提供的字段将返回经过验证的值。
可以设置为一个callable可调用对象,无需参数;在这种情况下,每次使用该值时都会对其求值。如果callable具有set_context方法,则每次在将字段实例作为唯一参数获取值之前都会被调用。这与验证器的工作方式相同。
注意:该字段不是必须的,并且不能与字段required=True时一起使用。
(6)source
默认为字段名称
将用于填充字段的属性的名称。可以是仅接受self参数的方法,例如URL(source='get_absolute_url'), 也可以使用点分符号遍历属性,例如 EmailField(source='user.email')。
该值source='*'具有特殊含义,用于指示应将整个对象传递给该字段。这对于创建嵌套表示或对于需要访问完整对象才能确定输出表示的字段很有用。
(7)help_text
可用作在HTML表单字段或其他描述性元素中对该字段进行描述的文本字符串。
(8)validators
验证器功能列表,应将其应用于输入字段输入,并引发验证错误或简单地返回。验证器函数通常应该提高serializers.ValidationError,但是ValidationError还支持Django的内置函数,以便与Django代码库或第三方Django软件包中定义的验证器兼容。
(9)error_messages
错误代码到错误消息的字典。
(10)initial、style、label
与前端html或渲染有关,暂时不说明
2:BooleanField(Field)
对应django.db.models.fields.BooleanField 字段。
为True值:['t', 'T', 'y', 'Y', 'yes', 'YES', 'true', 'True', 'TRUE', 'on', 'On', 'ON', '1', 1, True]
为False值:['f', 'F','n', 'N', 'no', 'NO','false', 'False', 'FALSE','off', 'Off', 'OFF','0', 0, 0.0, False]
为None值:['null', 'Null', 'NULL', '', None]
3: NullBooleanField(BooleanField)
对应django.db.models.fields.NullBooleanField 字段。
4:CharField(Field)
对应django.db.models.fields.CharField、django.db.models.fields.CommaSeparatedIntegerField、django.db.models.fields.TextField 三个字段。
参数说明(可选):
max_length: 验证输入的字符数最大数量。
min_length:验证输入的字符数最小数量。
allow_blank: 如果设置为True,则应将空字符串视为有效值。如果设置为,False则认为空字符串无效,并将引发验证错误。默认为False。
trim_whitespace :如果设置为,True则修剪前后的空白。默认为True。
5:EmailField(CharField)
对应django.db.models.fields.EmailField 字段,表示文本形式,将文本验证为有效的电子邮件地址。
6:RegexField(CharField)
对应django.forms.fields.RegexField 字段,表示正则文本,用于验证给定值是否与某个正则表达式匹配。
参数:
regex:可以是字符串,也可以是已编译的python正则表达式对象。使用Django的django.core.validators.RegexValidator 作为验证器。
7:SlugField(CharField)
对应django.db.models.fields.SlugField 字段,表示验证输入满足表达式[a-zA-Z0-9_-]+的RegexField字段。
参数:
allow_unicode:使用Django的django.core.validators.RegexValidator 作为验证器。 当该参数有值时,验证 re.compile(r'^[-\w]+\Z', re.UNICODE) 正则,否则验证 re.compile(r'^[-a-zA-Z0-9_]+$') 正则。
8:URLField(CharField)
对应 django.db.models.fields.URLField 字段。表示验证输入满足URL格式的RegexField字段。要求使用以下格式的完全限定网址http://<host>/<path>。使用Django的 django.core.validators.URLValidator进行验证。
9:UUIDField(Field)
对应 django.db.models.fields.UUIDField 字段。表示确保输入为有效UUID字符串的字段。该to_internal_value 方法将返回一个uuid.UUID实例。在输出时,该字段将返回标准连字符格式的字符串,例如:de305d54-75b4-431b-adb2-eb6b9e546013。
format 参数(可选),其值有:
'hex_verbose':规范的十六进制表示形式,包括连字符: "5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
'hex':UUID的紧凑十六进制表示形式,不包括连字符: "5ce0e9a55ffa654bcee01238041fb31a"
'int':UUID的128位整数表示: "123456789012312313134124512351145145114"
'urn':UUID的RFC 4122 URN表示形式: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
更改format参数仅影响表示形式值。 所有格式均被to_internal_value接受。
10:IPAddressField(CharField)
对应 对应于 django.forms.fields.IPAddressField 和 django.forms.fields.GenericIPAddressField 字段。表示输入为有效IPv4或IPv6字符串的字段。
参数(可选):
protocol:将有效输入限制为指定的协议。接受的值是“两个”(默认),“ IPv4”或“ IPv6”。匹配不区分大小写。
11:IntegerField(Field)
对应 django.db.models.fields.IntegerField、AutoField、BigIntegerField、PositiveIntegerField、PositiveSmallIntegerField、SmallIntegerField 字段。表示整数。
参数(可选):
max_value:最大值
min_value:最小值
12:FloatField(Field)
对应 django.db.models.fields.FloatField 字段。表示浮点数。
参数(可选):与11相同。
13:DecimalField(Field)
对应 django.db.models.fields.DecimalField 字段。表示十进制形式,在Python中由Decimal实例表示。
参数:
max_digits:必选,数字中允许的最大位数。它必须是None或大于等于 decimal_places的整数 。
decimal_places:必选,小数位数。
coerce_to_string:如果表示形式应该返回字符串值就设置为True, 或者应该返回Decimal对象的话就设置为 False。除非覆盖,否则默认为设置中COERCE_DECIMAL_TO_STRING设置键相同值的True值。 如果Decimal对象由序列化程序返回,则最终输出格式将由渲染器确定。请注意,设置localize会将值强制设为True。
max_value:最大值
min_value:最小值
localize:设置为True启用以基于当前语言环境本地化输入和输出。这也将迫使coerce_to_string到True。默认为False。请注意,如果你USE_L10N=True在设置文件中进行了设置,则会启用数据格式设置。
14:DateTimeField(Field)
对应 django.db.models.fields.DateTimeField 字段。表示日期和时间。
参数(可选):
format:输出格式的字符串。如果未指定,则默认为与api_settings.DATETIME_FORMAT设置键相同的值,其实就是 'iso-8601'。当然也可以指定格式为:%Y-%m-%d %H:%M:%S 等格式。格式字符串可以是显式指定格式的 Python strftime formats
default_timezone:时区对象。未指定,默认采用 Dajngo settings.USE_TZ 设置的时区值。
auto_now and auto_now_add model fields
使用ModelSerializer或HyperlinkedModelSerializer,请注意,默认情况下带有auto_now=True或任何模型字段auto_now_add=True都将使用read_only=True的序列化器字段。
如果要覆盖此行为,则需要DateTimeField在序列化程序上显式声明:
class CommentSerializer(serializers.ModelSerializer):
created = serializers.DateTimeField()
class Meta:
model = Comment
15:DateField(Field)
对应 django.db.models.fields.DateField 字段。表示日期。参数与 14 雷同。
16:TimeField(Field)
对应 django.db.models.fields.TimeField 字段。表示时间。参数与 14 雷同。
TimeField 格式化字符串
格式字符串可以是显式指定格式的Python strftime 格式,也可以是特殊字符串'iso-8601',它指示应使用ISO 8601样式时间。(例如'12:34:56.000000')
17:DurationField(Field)
对应于 django.db.models.fields.DurationField 字段。表示时间间隔。
在这些字段的validated_data将包含一个datetime.timedelta实例。该表示形式是遵循此格式的字符串'[DD] [HH:[MM:]]ss[.uuuuuu]'。
注意: 此字段仅适用于Django版本> = 1.8。
18:ChoiceField(Field)
可以接受有限选择集中的值的字段。
无论是allow_blank与allow_null上有效的选项ChoiceField,但我们强烈建议您只使用一个,而不是两个。allow_blank应该首选用于文本选择,并且allow_null应该首选用于数字或其他非文本选择。
参数:
choices:必选,有效值列表或(key, display_name)元组列表。
allow_blank:可选,如果设置为True,则应将空字符串视为有效值。如果设置为,False则认为空字符串无效,并将引发验证错误。默认为False。
html_cutoff:可选, 如果设置,则将是HTML select下拉列表将显示的最大选择数。可以用来确保自动生成的ChoiceFields具有非常大的选择范围,不会阻止模板的呈现。默认为None。
html_cutoff_text:可选,如果设置了此选项,则如果在HTML选择下拉列表中已截断最大数量的项目,则它将显示文本指示器。默认为"More than {count} items…"。
19:MultipleChoiceField(ChoiceField)
一个可以接受一组零个,一个或多个值的字段,这些值是从一组有限的选择中选择的。接受一个强制性参数。to_internal_value返回set包含所选值的。
参数:
choices:有效值列表或(key, display_name)元组列表。
allow_blank:如果设置为True,则应将空字符串视为有效值。如果设置为,False则认为空字符串无效,并将引发验证错误。默认为False。
html_cutoff:如果设置,则将是HTML select下拉列表将显示的最大选择数。可以用来确保自动生成的ChoiceFields具有非常大的选择范围,不会阻止模板的呈现。默认为None。
html_cutoff_tex: 如果设置了此选项,则如果在HTML选择下拉列表中已截断最大数量的项目,则它将显示文本指示器。默认为"More than {count} items…"。
与ChoiceField一样,allow_blank和allow_null选项都有效,尽管强烈建议您仅使用一个,而不要同时使用。allow_blank应该首选用于文本选择,并且allow_null应该首选用于数字或其他非文本选择。
文件上传字段
FileField 和 ImageField类是仅适用于使用MultiPartParser或FileUploadParser的。大多数解析器(例如JSON)不支持文件上传。Django的常规FILE_UPLOAD_HANDLERS用于处理上传的文件。
20:FileField(Field)
对应 django.forms.fields.FileField 字段。表示文件。执行Django的标准FileField验证。
参数(可选):
max_length:指定文件名的最大长度。
allow_empty_file:指定是否允许空文件。
use_url:如果设置为True则URL字符串值将用于输出表示。如果设置为False则文件名字符串值将用于输出表示。默认为UPLOADED_FILES_USE_URL设置键的值,除非另有设置,否则为默认值True。
21:ImageField(FileField)
对应于 django.forms.fields.ImageField 字段。表示图片。 验证上传的文件内容是否与已知图像格式匹配。
需要安装Pillow包或PIL包。推荐使用Pillow包,因为PIL包已经不积极维护。
参数(可选):
max_length:指定文件名的最大长度。
allow_empty_file:指定是否允许空文件。
use_url:如果设置为True则URL字符串值将用于输出表示。如果设置为False则文件名字符串值将用于输出表示。默认为UPLOADED_FILES_USE_URL设置键的值,除非另有设置,否则为默认值True。
22:ListField(Field)
验证对象列表的字段类。
参数(可选):
child: 应该用于验证列表中对象的字段实例。如果未提供此参数,则将不验证列表中的对象。
allow_empty:是否允许为空
min_length:验证列表中包含的元素不少于此数量。
max_length:验证列表中所包含的元素数量不超过此数量。
23:DictField(Field)
一个验证对象字典的字段类。 DictField 中的key都总是假定为字符串值。
参数(可选):
child: 应该用于验证列表中对象的字段实例。如果未提供此参数,则将不验证列表中的对象。
allow_empty:是否允许为空
24:JSONField(Field)
一个字段类,用于验证传入的数据结构是否包含有效的JSON原语。在其备用二进制模式下,它将表示并验证JSON编码的二进制字符串。
参数(可选):
binary:如果设置为True则该字段将输出并验证JSON编码的字符串,而不是原始数据结构。默认为False
encoder:json编码器
decoder:json解码器
25: ReadOnlyField(Field)
一个字段类,仅返回该字段的值而无需修改。
ModelSerializer当包含与属性而不是模型字段相关的字段名称时,默认情况下使用此字段。
26:HiddenField(Field)
一个字段类,它不基于用户输入获取值,而是从默认值或可调用对象获取其值。
27:ModelField(Field)
可以绑定到任意模型字段的通用字段。 ModelField类将序列化/反序列化任务委托给与其关联的model字段。 此字段可用于为自定义模型字段创建序列化程序字段,而不必创建新的自定义序列化程序字段。
该字段用于ModelSerializer对应于自定义模型字段类。
28:SerializerMethodField(Field)
这是一个只读字段。它通过在附加的序列化器类上调用一个方法来获取其值。它可以用于将任何类型的数据添加到对象的序列化表示中。
参数(可选):
method_name: 要调用的序列化程序上的方法的名称。如果未包括,则需要在序列化器中写上 get_<field_name> 方法
method_name参数引用的序列化程序方法应接受单个参数(除了之外self),该参数是要序列化的对象。它应该返回要包含在对象的序列化表示中的任何内容。
网友评论