1. [
  1. 课程介绍
  2. ](_index_)
    1. [
  1. 引入DjangoRESTframework
  2. ](c01-introducetodrf_index)
  3. -
  4. [
  5. Web应用模式
  6. ](c01-introducetodrf_separatedfrontendandbackend)
    1. [
  1. 认识RESTful
  2. ](c01-introducetodrf_introducetorest)
    1. [
  1. RESTful设计方法
  2. ](c01-introducetodrf_howtodesignrest)
    1. [
  1. 使用Django开发REST接口
  2. ](c01-introducetodrf_developrestapiwithdjango)
    1. [
  1. 明确REST接口开发的核心任务
  2. ](c01-introducetodrf_coretasktodeveloprestapi)
    1. [
  1. DjangoRESTframework简介
  2. ](c01-introducetodrf_aboutdrf)
    1. [
  1. DRF工程搭建
  2. ](c02-drfproject_index)
  3. -
  4. [
  5. 环境安装与配置
  6. ](c02-drfproject_installandconfig)
    1. [
  1. 见识DRF的魅力
  2. ](c02-drfproject_thefirstdrfprogram)
    1. [
  1. Serializer序列化器
  2. ](c03-serializer_index)
  3. -
  4. [
  5. 定义Serializer
  6. ](c03-serializer_declaring)
    1. [
  1. 序列化使用
  2. ](c03-serializer_serializing)
    1. [
  1. 反序列化使用
  2. ](c03-serializer_deserializing)
    1. [
  1. 模型类序列化器ModelSerializer
  2. ](c03-serializer_modelserializer)
    1. [
  1. 视图
  2. ](c04-view_index)
  3. -
  4. [
  5. RequestResponse
  6. ](c04-view_requestandresponse)
    1. [
  1. 视图概览
  2. ](c04-view_view)
    1. [
  1. 视图说明
  2. ](c04-view_viewintroduction)
    1. [
  1. 视图集ViewSet
  2. ](c04-view_viewset)
    1. [
  1. 路由Router
  2. ](c04-view_routers)
    1. [
  1. 其他功能
  2. ](c05-components_index)
  3. -
  4. [
  5. 认证
  6. ](c05-components_authentication)
    1. [
  1. 权限
  2. ](c05-components_permissions)
    1. [
  1. 限流
  2. ](c05-components_throttling)
    1. [
  1. 过滤
  2. ](c05-components_filtering)
    1. [
  1. 排序
  2. ](c05-components_ordering)
    1. [
  1. 分页
  2. ](c05-components_pagination)
    1. [
  1. 版本
  2. ](c05-components_versioning)
    1. [
  1. 异常处理
  2. ](c05-components_exceptions)
    1. [
  1. 自动生成接口文档
  2. ](c05-components_documents)
    1. [
    2. Published with GitBook
    3. ](https://www.gitbook.com)

课程介绍

定义Serializer

1. 定义方法

Django REST framework中的Serializer使用类来定义,须继承自rest_framework.serializers.Serializer。
例如,我们已有了一个数据库模型类BookInfo

  1. class BookInfo(models.Model):
  2. btitle = models.CharField(max_length=20, verbose_name='名称')
  3. bpub_date = models.DateField(verbose_name='发布日期', null=True)
  4. bread = models.IntegerField(default=0, verbose_name='阅读量')
  5. bcomment = models.IntegerField(default=0, verbose_name='评论量')
  6. image = models.ImageField(upload_to='booktest', verbose_name='图片', null=True)

我们想为这个模型类提供一个序列化器,可以定义如下:

  1. class BookInfoSerializer(serializers.Serializer):
  2. """图书数据序列化器"""
  3. id = serializers.IntegerField(label='ID', read_only=True)
  4. btitle = serializers.CharField(label='名称', max_length=20)
  5. bpub_date = serializers.DateField(label='发布日期', required=False)
  6. bread = serializers.IntegerField(label='阅读量', required=False)
  7. bcomment = serializers.IntegerField(label='评论量', required=False)
  8. image = serializers.ImageField(label='图片', required=False)

注意:serializer不是只能为数据库模型类定义,也可以为非数据库模型类的数据定义。serializer是独立于数据库之外的存在。

2. 字段与选项

常用字段类型

| 字段 | 字段构造方式 | | —- | —- |

| BooleanField | BooleanField() |

| NullBooleanField | NullBooleanField() |

| CharField | CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True) |

| EmailField | EmailField(max_length=None, min_length=None, allow_blank=False) |

| RegexField | RegexField(regex, max_length=None, min_length=None, allow_blank=False) |

| SlugField | SlugField(maxlength=50, min_length=None, allow_blank=False) 正则字段,验证正则模式 [a-zA-Z0-9
-]+ |

| URLField | URLField(max_length=200, min_length=None, allow_blank=False) |

| UUIDField | UUIDField(format=’hex_verbose’) format: 1) 'hex_verbose'"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex'"5ce0e9a55ffa654bcee01238041fb31a" 3)'int' - 如: "123456789012312313134124512351145145114" 4)'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"


|

| IPAddressField | IPAddressField(protocol=’both’, unpack_ipv4=False, **options) |

| IntegerField | IntegerField(max_value=None, min_value=None) |

| FloatField | FloatField(max_value=None, min_value=None) |

| DecimalField | DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None)max_digits: 最多位数decimal_palces: 小数点位置

|

| DateTimeField | DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None) |

| DateField | DateField(format=api_settings.DATE_FORMAT, input_formats=None) |

| TimeField | TimeField(format=api_settings.TIME_FORMAT, input_formats=None) |

| DurationField | DurationField() |

| ChoiceField | ChoiceField(choices)choices与Django的用法相同
|

| MultipleChoiceField | MultipleChoiceField(choices) |

| FileField | FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |

| ImageField | ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |

| ListField | ListField(child= |

| DictField | DictField(child= |

选项参数:

| 参数名称 | 作用 | | —- | —- |

| max_length | 最大长度 |

| min_length | 最小长度 |

| allow_blank | 是否允许为空 |

| trim_whitespace | 是否截断空白字符 |

| max_value | 最大值 |

| min_value | 最小值 |

通用参数:

| 参数名称 | 说明 | | —- | —- |

| read_only | 表明该字段仅用于序列化输出,默认False |

| write_only | 表明该字段仅用于反序列化输入,默认False |

| required | 表明该字段在反序列化时必须输入,默认True |

| default | 反序列化时使用的默认值 |

| allow_null | 表明该字段是否允许传入None,默认False |

| validators | 该字段使用的验证器 |

| error_messages | 包含错误编号与错误信息的字典 |

| label | 用于HTML展示API页面时,显示的字段名称 |

| help_text | 用于HTML展示API页面时,显示的字段帮助提示信息 |

3. 创建Serializer对象

定义好Serializer类后,就可以创建Serializer对象了。
Serializer的构造方法为:

  1. Serializer(instance=None, data=empty, **kwarg)

说明:
1)用于序列化时,将模型类对象传入instance参数
2)用于反序列化时,将要被反序列化的数据传入data参数
3)除了instance和data参数外,在构造Serializer对象时,还可通过context参数额外添加数据,如

  1. serializer = AccountSerializer(account, context={'request': request})

通过context参数附加的数据,可以通过Serializer对象的context属性获取。