咱们继续以前的内容,让咱们先进入项目文件夹react_drf
,激活虚拟环境,并安装REST framework
:html
$ source venv/bin/activate // 激活后命令提示符前面会出现(venv) (venv) $ pip install djangorestframework
Django REST framework is a powerful and flexible toolkit for building Web APIs.
官方介绍:Django REST framework是一个用于构建WEB API的强大而灵活的工具。前端
还记得在上一篇文章中提到的RESTful API
吗?此次咱们就来试试使用REST framework
这个库来改造咱们以前写的程序。python
安装完成后,记获得项目文件夹backend/backend/settings.py
文件中注册:react
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', # 加上这个 'article.apps.ArticleConfig', ]
打开咱们的backend/article/models.py
文件,本来的内容有点少,咱们首先把这个模型扩展一下:shell
from django.db import models class Article(models.Model): title = models.CharField(max_length=50) body = models.TextField() created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) class Meta: ordering = ('-created',)
注意咱们定义的继承了models.Model
的类Article
,与数据库中的表有对应关系,能够看到这个类的不一样属性分别是不一样的对象示例,它们对应了数据库中的表的不一样列,而且表明了不一样的数据类型。数据库
created
与updated
经过将两个不一样的参数设置为True
实现了自动保存建立时间与最后修改时间的功能。django
这里在元类里定义了以建立时间降序排序,注意ordering
应该是一个元组,因此别忘了逗号,
后端
好啦,还记得每次更改模型后要作什么?session
(venv) $ python manage.py makemigrations article Migrations for 'article': article/migrations/0001_initial.py - Create model Article (venv) $ python manage.py migrate Operations to perform: Apply all migrations: admin, article, auth, authtoken, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK …… Applying sessions.0001_initial... OK
如今迁移完成了,可是如今不急着去写视图和模板,咱们要开始制做本身的RESTful API。app
还记得以前提过,REST
的意思是表现层状态转换
,咱们须要有一个工具来对模型进行序列化与反序列化,通俗的讲法序列化就是将语言中的对象转化为能够存储或传输的形式,反序列化就是反过来的过程。
在先后端分离模式的开发中,因为先后端语言每每是不一样的,例如后端Java
,前端JavaScript
,或者有移动端的Kotlin
,每每须要一种较为通用的格式,JSON
就是一个不错的选择。
好了,开始行动吧,在article
文件夹中新建一个serializers.py
文件:
# article/serializers.py class ArticleSerializer(serializers.Serializer): id = serializers.IntegerField(read_only=True) title = serializers.CharField(required=True, max_length=50) body = serializers.CharField(required=True) created = serializers.DateTimeField(read_only=True) updated = serializers.DateTimeField(read_only=True) def create(self, validated_data): return Article.objects.create(**validated_data) def update(self, instance, validated_data): instance.title = validated_data.get('title', instance.title) instance.body = validated_data.get('body', instance.title) instance.save() return instance
因为TextField
是Django
定义的针对大文本内容的扩展字段,因此在rest_framework
中仍是只能用CharField
来序列化。覆写create
与update
方法来定义调用serializer.save()
时的行为。参数required=True
表示必填,read_only=True
表示只读。
Django
为咱们提供了一个交互式的调试环境,输入命令python manage.py shell
命令,进入交互环境。
先来看看序列化一个Article
实例:
>>> from article.models import Article >>> from article.serializers import ArticleSerializer >>> from rest_framework.renderers import JSONRenderer >>> from rest_framework.parsers import JSONParser >>> article = Article(title="React", body="React is good") >>> article.save() >>> serializer = ArticleSerializer(article) >>> serializer.data {'id': 2, 'title': 'React', 'body': 'React is good', 'created': '2020-03-21T21:19:31.732703', 'updated': '2020-03-21T21:19:31.732728'}
以前经过序列化器将实例序列化为Python
内置的字典类型,如今看看将其转为JSON
:
>>> content = JSONRenderer().render(serializer.data) >>> content b'{"id":2,"title":"React","body":"React is good","created":"2020-03-21T21:19:31.732703","updated":"2020-03-21T21:19:31.732728"}'
反序列化与上面相似,但步骤相反:
>>> import io >>> stream = io.BytesIO(content) >>> data = JSONParser().parse(stream) >>> serializer = ArticleSerializer(data=data) >>> serializer.is_valid() True >>> serializer.validated_data OrderedDict([('title', 'React'), ('body', 'React is good')]) >>> serializer.save() <Article: Article object (3)> # 这里为3是由于我最初存了一个数据
REST framework
为咱们提供了一个更为简洁的编写序列化器的方式:
# 修改本来的ArticleSerializer类 class ArticleSerializer(serializers.ModelSerializer): class Meta: model = Article fields = ['id', 'title', 'body', 'created', 'updated']
能够在交互模式下看看:
>>> from article.serializers import ArticleSerializer >>> serializer = ArticleSerializer() >>> print(repr(serializer)) ArticleSerializer(): id = IntegerField(label='ID', read_only=True) title = CharField(max_length=50) body = CharField(style={'base_template': 'textarea.html'}) created = DateTimeField(read_only=True) updated = DateTimeField(read_only=True) >>>
ModelSerializer
帮咱们自动生成了所需的字段,而且拥有create
与update
方法的默认实现。这是官方为咱们提供的实现一个序列化器的快捷方式。注意到这里还对模型中的TextField
类型的body
作了特殊处理,定义了其渲染成HTML
时的格式。
若是你对原生Django
的表单熟悉,你会发现这个Serializer
与原生的Form
很是类似。
如今咱们熟悉了序列化与反序列化,在下一篇文章中,咱们将为咱们的API编写一个新的视图(View)。
扫码关注公子政的宅平常第一时间查看最新推送: