Django系列 7:Rest Framework Serializer字段详解

这一节我们聊聊 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)initialstylelabel

        与前端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),该参数是要序列化的对象。它应该返回要包含在对象的序列化表示中的任何内容。

参考文章:Django Rest Framework详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343

推荐阅读更多精彩内容

  • serializers是什么?官网是这样的”Serializers allow complex data such...
    程序员同行者阅读 1,232评论 0 1
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,487评论 16 22
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,551评论 0 11
  • 可爱进取,孤独成精。努力飞翔,天堂翱翔。战争美好,孤独进取。胆大飞翔,成就辉煌。努力进取,遥望,和谐家园。可爱游走...
    赵原野阅读 2,715评论 1 1
  • 在妖界我有个名头叫胡百晓,无论是何事,只要找到胡百晓即可有解决的办法。因为是只狐狸大家以讹传讹叫我“倾城百晓”,...
    猫九0110阅读 3,255评论 7 3