目录
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.py的INSTALLED_APPS中添加rest_framework,如下图所示。
INSTALLED_APPS = [
...
'rest_framework',
]
接下来就可以使用DRF进行开发了。
Serializer序列化器
序列化器的作用:
- 进行数据的校验
- 对数据对象进行转换
定义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是独立于数据库之外的存在。
字段选项
常用字段类型:
|
|
---|---|
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(max_length=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’ 如 "1234567894613216548974131123415" 4)‘urn’ 如 “urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a” |
IPAddressField | IPAddressField(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:小数点位置 |
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_setting.DATETIME_FORMAT,input_formats=None) |
DateField | DateField(format=api_setting.DATE_FORMAT,input_formats=None) |
TimeField | TimeField(format=api_setting.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=,min_length=None,max_length=None) |
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页面时,显示的字段帮助提示信息 |
创建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属性获取