官方文档:https://www.django-rest-framework.org/

GitHub源码:https://github.com/encode/django-rest-framework/tree/master

1. 安装DRF

pip install djangorestframework

  

2. 添加rest_framework应用

我们利用在Django框架学习中创建的demo工程,在settings.py的INSTALLED_APPS中添加'rest_framework'。

INSTALLED_APPS = [...'rest_framework',
]

  

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

定义Serializer

1. 定义方法

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='发布日期', null=True)bread = models.IntegerField(default=0, verbose_name='阅读量')bcomment = models.IntegerField(default=0, verbose_name='评论量')image = models.ImageField(upload_to='booktest', verbose_name='图片', null=True)

  

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

class BookInfoSerializer(serializers.Serializer):"""图书数据序列化器"""id = serializers.IntegerField(label='ID', read_only=True)btitle = serializers.CharField(label='名称', max_length=20)bpub_date = serializers.DateField(label='发布日期', required=False)bread = serializers.IntegerField(label='阅读量', required=False)bcomment = serializers.IntegerField(label='评论量', required=False)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=<a_field_instance>, min_length=None, max_length=None)
DictField DictField(child=<a_field_instance>)

选项参数:

参数名称 作用
max_length 最大长度
min_lenght 最小长度
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页面时,显示的字段帮助提示信息

序列化的使用

1.基本使用

对一个图书对象进行序列化

from booktest.models import BookInfo
from booktest.serializers import BookInfoSerializer
book = BookInfo.objects.get(id=2)
serializer = BookInfoSerializer(book)serializer.data
# {'id': 2, 'btitle': '天龙八部', 'bpub_date': '1986-07-24', 'bread': 36, 'bcomment': 40, 'image': None}

 对多个图书对象进行序列化,注意需要加参数many=True

from booktest.models import BookInfo
from booktest.serializers import BookInfoSerializer
book_qs = BookInfo.objects.all()
serializer = BookInfoSerializer(book_qs, many=True)
serializer.data
# [OrderedDict([('id', 2), ('btitle', '天龙八部'), ('bpub_date', '1986-07-24'), ('bread', 36), ('bcomment', 40), ('image', N]), OrderedDict([('id', 3), ('btitle', '笑傲江湖'), ('bpub_date', '1995-12-24'), ('bread', 20), ('bcomment', 80), ('image'ne)]), OrderedDict([('id', 4), ('btitle', '雪山飞狐'), ('bpub_date', '1987-11-11'), ('bread', 58), ('bcomment', 24), ('ima None)]), OrderedDict([('id', 5), ('btitle', '西游记'), ('bpub_date', '1988-01-01'), ('bread', 10), ('bcomment', 10), ('im', 'booktest/xiyouji.png')])]

  

2 关联对象嵌套序列化(在有外键的时候使用)

1) PrimaryKeyRelatedField

此字段将被序列化为关联对象的主键。

hbook = serializers.PrimaryKeyRelatedField(label='图书', read_only=True)

  

2) StringRelatedField

此字段将被序列化为关联对象的字符串表示方式(即__str__方法的返回值)

hbook = serializers.StringRelatedField(label='图书')

  

3)使用关联对象的序列化器

hbook = BookInfoSerializer()

  

反序列化使用

使用序列化器进行反序列化时,需要对数据进行验证后,才能获取验证成功的数据或保存成模型类对象。

在获取反序列化的数据前,必须调用is_valid()方法进行验证,验证成功返回True,否则返回False。

验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。

验证成功,可以通过序列化器对象的validated_data属性获取数据。

from booktest.serializers import BookInfoSerializer
data = {'bpub_date': 123}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()  # 返回False
serializer.errors
# {'btitle': [ErrorDetail(string='This field is required.', code='required')], 'bpub_date': [ErrorDetail(string='Date has wrong format. Use one of these formats instead: YYYY[-MM[-DD]].', code='invalid')]}
serializer.validated_data  # {}data = {'btitle': 'python'}
serializer = BookInfoSerializer(data=data)
serializer.is_valid()  # True
serializer.errors  # {}
serializer.validated_data  #  OrderedDict([('btitle', 'python')])

  

is_valid()方法还可以在验证失败时抛出异常serializers.ValidationError,可以通过传递raise_exception=True参数开启,REST framework接收到此异常,会向前端返回HTTP 400 Bad Request响应。

# Return a 400 response if the data was invalid.
serializer.is_valid(raise_exception=True)

  

 

转载于:https://www.cnblogs.com/LiuXinyu12378/p/11247073.html

Django REST framework的使用简单介绍相关推荐

  1. Entity Framework Core 之简单介绍

    Overview EFCore是一个以对象映射器(O/RM)为核心的轻量级.可扩展的实体框架数据访问技术,目前支持Microsoft SQL Server.SQLite.Postgres(Npgsql ...

  2. django中使用celery简单介绍

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 本章节我们重点在于实现,如何存储任务的结果. 我们将任务函数改为: from celery_demo.celery im ...

  3. Django - Django框架 简单介绍

    Django框架 简单介绍 本文地址: http://blog.csdn.net/caroline_wendy/article/details/29172271 1. 介绍 Django是一个开放源码 ...

  4. python django框架分析_Django框架模型简单介绍与使用分析

    本文实例讲述了Django框架模型简单介绍与使用.分享给大家供大家参考,具体如下: ORM介绍 ORM Object relational mapping 对象关系映射 把面向对象中的类和数据库表一一 ...

  5. DRF (Django REST framework) 框架介绍

    Web应用模式 在开发Web应用中,有两种应用模式: 前后端不分离 前后端分离 1 前后端不分离 在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控 ...

  6. python网站设计理念_简单介绍下python Django框架的历史,设计理念及优势_Django讲解2...

    简单介绍下python Django框架的历史,设计理念及优势 Django是一个高层次的 Python Web 框架,它是一个鼓励快速开发和干净,实用的框架设计.Django可以更容易地快速构建更好 ...

  7. Python 框架 之 Django MVT 下的 T 的 模板简单介绍和使用

    Python 框架 之 Django MVT 下的 T 的 模板简单介绍和使用 目录

  8. Python 框架 之 Django MVT 下的 V 的 视图简单介绍和使用

    Python 框架 之 Django MVT 下的 V 的 视图简单介绍和使用 目录

  9. Python 框架 之 Django MVT 下的 M 的 模型的简单介绍和使用

    Python 框架 之 Django MVT 下的 M 的 模型的简单介绍和使用 目录

最新文章

  1. 一阵骚操作,我把SQL执行效率提高了10000000倍!
  2. Linux 环境下如何安装部署 RocketMQ 教程
  3. 智办事:高效的目标管理,让企业战略目标得以实现
  4. 从语言学到深度学习NLP,一文概述自然语言处理
  5. NIO详解(十一):线程间通信管道Pipe
  6. 修改Oracle中的某一带有数据的列的数据类型
  7. (011)XHTML文档之列表
  8. Scaleform GFx
  9. PHP IDE免费干货来了!
  10. SAP Spartacus 自定义 Component 的使用 - SimpleResponsiveBannerComponent
  11. a73*2+a53*2指的是什么_篮球内外线是什么意思?篮球外线是什么位置-百科-
  12. 从二进制数据流中构造GDAL可以读取的图像数据(C#)
  13. grep命令_「Linux」- ps -ef |grep 命令
  14. 记一次360面试总结(Android)
  15. 学校教材订购系统 Java_高校网上教材征订系统,基于SSM框架下的JAVA系统
  16. 助力NBA复赛背后,NBA与可穿戴设备的纠葛缠斗
  17. 帮我起个名字,带淇,两个字的
  18. EUV光刻机内部揭秘!
  19. 阿里云oss对象存储的使用
  20. `git fetch` 和 `git remote update origin --prune` 的区别(以及跟`git pull` 的区别)

热门文章

  1. 农村家庭暴力有什么应对的措施
  2. 流媒体技术{包括Http渐进式下载,即html5 video audio标签支持的协议}
  3. idea快速开发之代码块编辑
  4. 微信小程序开发关于地图图片显示不出问题
  5. plsql能不能连接mysql_plsql可以连接MySQL吗
  6. mysql查找各科分数相同的学生_mysql中 查询各科成绩都在80以上的学生的姓名
  7. shell编程时,引用相对路径的shell文件
  8. 3.2.1 运维自动化之ansible模块
  9. python代理服务器
  10. 爬虫训练场项目重要组件,导航栏+轮播图