Django衍生框架DRF框架(Django REST framework)的简单应用1(序列化器的介绍)

DRF框架(Django REST framework)

本文档由本人整理相关资料整合而成,以个人理解方便查阅。

简介

Django REST framework框架是一个勇于构建Web API的强大而又灵活的工具。

通常简称DRF框架 或者 REST framework
DRF框架是建立在Django框架基础之上,由Tom Christie大牛二次开发的开源项目

特点:

  • 提供了定义序列化器Serializer的方法,可以快速根据Django ORM或者其它库自动序列化/反序列化;
  • 提供了丰富的类视图、Mixin扩展类,简化视图的编写;
  • 丰富的定制层级:函数视图、类视图、视图集合到自动生成API,满足各种需要;
  • 多种身份认证和权限认证方式的支持;
  • 内置了限流系统;
  • 直观的API web界面;
  • 可扩展性,插件丰富;

资料:

官方文档

DRF工程搭建

DRF需要以下依赖:

  • Python(2.7,3.2,3.3,3.4,3.5,3.6)
  • Django(1.10,1.11,2.0)

安装DRF

在终端进入Django的虚拟环境,
运行指令:

pip install djangorestframework

添加rest_framework应用

rest_framework是以应用的形式注册在Django工程中的,在setting.pyINSTALLED_APPS中添加rest_framework,如下图所示。

INSTALLED_APPS = [
	...
	'rest_framework',
]

接下来就可以使用DRF进行开发了。

Serializer序列化器

序列化器的作用:

  1. 进行数据的校验
  2. 对数据对象进行转换

定义serializer

定义方法

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

class BookInfo(models.Model):
    btitle=models.CharField(max_length=20,verbose_name='名称')
    bpub_date=models.DateField(verbose_name='发布时期')
    bread=models.IntegerField(default=0,verbose_name='阅读量')
    bcomment=models.IntegerField(default=0,verbose_name='评论量')
    is_delete=models.BooleanField(default=False,verbose_name='逻辑删除')
    image=models.ImageField(upload_to='booktest',verbose_name='图片',null=True)
    
    class Meta:
        db_table='tb_books' # 指明数据库表名
        verbose_name='图书' # 在admin站点中显示的名称
        verbose_name_plural=verbose_name # 显示的复数名称

    def __str__(self):
        # 定义每个数据对象的显示信息
        return self.btitle

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

class BookInfoSerializer(serializers.Serializer):
    # read_only=True表示该字段只作用于序列化操作
    id=serializers.IntegerField(label='ID',read_only=True)
    # max_length指定字符最大长度
    btitle=serializers.CharField(label='名称',max_length=20)
    # required=True表示当前字段必须传递
    bpub_date=serializers.DateField(label='发布日期',required=True)
    # write_only=True表示该字段只作用于反序列化操作
    # bread=serializers.IntegerField(label='阅读量',required=False,write_only=True)
    bread=serializers.IntegerField(label='阅读量',required=False,min_value=0)
    bcomment=serializers.IntegerField(label='评论量',required=False)
    image=serializers.ImageField(label='图片',required=False)
    # 逻辑删除
    is_delete=serializers.BooleanField(label='图片',allow_null=True)

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

字段选项

常用字段类型:

字段
字段构造方式
BooleanFieldBooleanField()
NullBooleanFieldNullBooleanField()
CharFieldCharField(max_length=None,min_length=None,allow_blank=False,trim_whitespace=True)
EmailFieldEmailField(max_length=None,min_length=None,allow_blank=False)
RegexFieldRegexField(regex,max_length=None,min_length=None,allow_blank=False)
SlugFieldSlugField(max_length=50,min_length=None,allow_blank=False)
正则字段,验证正则模式[a-zA-Z0-9-]+
URLFieldURLField(max_length=200,min_length=None,allow_blank=False)
UUIDFieldUUIDField(format=‘hex_verbose’)
format:
1)‘hex_verbose’ 如 "5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
2)‘hex’ 如 "5ce0e9a55ffa654bcee01238041fb31a"
3)‘int’ 如 "1234567894613216548974131123415"
4)‘urn’ 如 “urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a”
IPAddressFieldIPAddressField(max_value=None,min_value=None)
DecimalFieldDecimalField(max_digits,decimal_places,coerce_to_string=None,
max_value=None,min_value=None)
max_digits:最多位数
decimal_palces:小数点位置
IPAddressFieldIPAddressField(protocol=‘both’,unpack_ipv4=False,**options)
IntegerFieldIntegerField(max_value=None,min_value=None)
FloatFieldFloatField(max_value=None,min_value=None)
DecimalFieldDecimalField(max_digits,decimal_places,coerce_to_string=None,
max_value=None,min_value=None)
max_digits:最多位数
decimal_palces:小数点位置
DateTimeFieldDateTimeField(format=api_setting.DATETIME_FORMAT,input_formats=None)
DateFieldDateField(format=api_setting.DATE_FORMAT,input_formats=None)
TimeFieldTimeField(format=api_setting.TIME_FORMAT,input_formats=None)
DurationFieldDurationField()
ChoiceFieldChoiceField(choices)
choices与Django的用法相同
MultipleChoiceFieldMultipleChoiceField(choices)
FileFieldFileField(max_length=None,allow_empty_file=False,
use_url=UPLOADED_FILES_USE_URL)
ImageFieldImageField(max_length=None,allow_empty_file=False,
use_url=UPLOADED_FILES_USE_URL)
ListFieldListField(child=,min_length=None,max_length=None)
DictFieldDictField(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页面时,显示的字段帮助提示信息

创建Serializer对象

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

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

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

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

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值