

使用Django2.0构建Python Restful Web服务:十)创建模型序列化器
source link: https://zmister.com/archives/415.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在上一小篇文章中,我们设计并创建和新的Django项目的模型,本篇我们继续《使用Django 2.0构建Python Restful Web服务》。今天我们来为模型创建序列化和反序列化器,对电影分类模型、电影模型、观众模型、和电影评分模型分别创建模型的序列化器。
在这里,我们的模型之间都是有相互的关联关系的,为了体现模型之间的关联性,我们在创建序列化器的时候也需要考虑到。
文章目录 [显示]
一、使用超链接序列化器
在本系列教程的第五篇,我们曾经使用rest_framework的序列化类创建过一个简单的模型序列化器,而在本篇文章中,我们则使用更加高级的超链接模型序列化器——HyperlinkedModelSerializer()。超链接模型序列化器有什么特别之处呢,我们来看看rest_framwork源码中的介绍:
"""
A type of `ModelSerializer` that uses hyperlinked relationships instead
of primary key relationships. Specifically:
* A 'url' field is included instead of the 'id' field.
* Relationships to other instances are hyperlinks, instead of primary keys.
"""
简而言之就是通过超链接的形式来表示模型之间的关系,并通过url字段与其他模型进行连接。这样的概念似乎不是很清晰,下面我们通过实际的代码来演示一下。
在userscore目录下创建一个名为serializers.py的文件,我们的模型序列化器就在这里面进行定义
二、电影分类模型序列化器
电影分类模型的序列化器是我们定义的第一个序列化器,我们在serializers.py文件中写入以下代码:
# 电影分类序列化器
class MovieCategorySerializer(serializers.HyperlinkedModelSerializer):
# 使用超链接关系字段
movies = serializers.HyperlinkedRelatedField(
many=True, # 表示序列化多个对象
read_only=True,# 表示在序列化时使用,反序列化时不使用
view_name = 'movie-detail' # 绑定对应的超链接视图函数名,默认情况下为:模型名称-detail
)
class Meta:
model = MovieCategory # 序列化器对应的模型
# 序列化器返回的字段
fields = (
'url',
'pk',
'name',
'movies'
)
在MovieCategorySerializer序列化器中,我们继承了超链接模型序列化器HyperlinkedModelSerializer,然后使用超链接关系字段HyperlinkedRelatedField来声明movies字段,同时使用many属性设置该序列化器序列化多个对象,使用read_only属性设置其用于只读状态,使用view_name属性确定超链接的视图函数。
三、电影序列化器
对于电影序列化器,我们依然继承自HyperlinkedModelSerializer(),同时在电影序列化器中使用序列化器的标签关系字段SlugRelatedField()来描述电影分类字段,最后,在Meta()中声明电影序列化器使用到的模型Movie和各个字段。电影序列化器MovieSerializer()的代码如下所示:
# 电影序列化器
class MovieSerializer(serializers.HyperlinkedModelSerializer):
# 使用标签关系字段定义分类
movie_category = serializers.SlugRelatedField(queryset=MovieCategory.objects.all(),slug_field='name')
class Meta:
model = Movie
fields = (
'url',
'movie_category',
'name',
'release_date',
'viewed',
)
四、电影评分序列化器
在模型model中,我们的电影评分模型中有两个外键字段——观众字段和电影字段,这些外键字段需要我们在创建序列化器的时候进行另外的处理。在电影评分序列化器中,外键字段我们只设置电影的字段,观众字段我们将在观众序列化器中将电影评分序列化器包含进去。所以,电影评分序列化器的代码如下:
# 电影评分序列化器
class ScoreSerializer(serializers.ModelSerializer):
movie = MovieSerializer()
class Meta:
model = MovieScore
fields = (
'url',
'pk',
'score',
'score_date',
'movie'
)
五、观众序列化器
现在轮到了观众序列化器。在电影评分序列化器中,我们没有将观众字段添加进行,因为我们将在观众序列化器添加评分字段,而这在观众模型中是不存在的。所以观众序列化器的代码如下所示:
# 观众序列化器
class ViewerSerializer(serializers.HyperlinkedModelSerializer):
scores = ScoreSerializer(many=True,read_only=True)
gender = serializers.ChoiceField(choices=Viewer.GENDER_CHOICES)
gender_description = serializers.CharField(source='get_gender_display',read_only=True)
class Meta:
model = Viewer
fields = (
'url',
'name',
'gender',
'gender_description',
'scores'
)
六、观众评分序列化器
除了模型中对应的各个模型的序列化器,我们再创建一个综合的序列化器——观众评分序列化器,用于获得观众的电影评分。其代码如下所示:
# 观众评分序列化器
class ViewerScoreSerializer(serializers.ModelSerializer):
Viewer = serializers.SlugRelatedField(queryset=Viewer.objects.all(), slug_field='name')
movie = serializers.SlugRelatedField(queryset=Movie.objects.all(), slug_field='name')
class Meta:
model = MovieScore
fields = (
'url',
'pk',
'score',
'score_date',
'viewer',
'movie'
)
这样,我们就创建完了Django项目所需的所有模型序列化器,下一步,我们将创建在视图函数中对数据进行反序列化。有疑问欢迎留言讨论。
Recommend
-
87
以前写过ASP.NET Core 2.x的REST API文章,今年再更新一下到3.0版本。 先决条件 我在B站有一个非常入门的ASP.NET Core 3.0的视频教程,如果您对ASP.NET Core不了解,就可以先看一下里面的...
-
15
当ASP . NET Core 大约在 2.1 版本的时候,它引入了 ProblemDetails 。 ProblemDetails 是基于 RFC7807 这个...
-
4
在上一章,我们完成了一个Django环境的搭建的安装。本章开始,我们着手构建我们基于Django的Restful服务,创建一个存储和记录电影信息的数据模型。 在现代动态网站中,底层数据库是每个网站的标配,也是绝大多数网站的唯一的数据来源,其用于存储网站所...
-
1
本指南将引导您完成使用 Spring 创建“Hello, World”RESTful Web 服务的过程。
-
3
-
4
使用Django2.0.4集成钉钉第三方扫码登录首页 - Python/2019-12-21 钉钉作为阿里旗下的一款免费移动通讯...
-
9
Win10系统下使用Django2.0.4+Celery4.4.2+Redis来实现异步任务队列以及定时(周期)任务(2020年最新攻略)首页 - Python/...
-
6
使用Python3.7+Django2.0.4配合vue.js2.0的组件递归来实现无限级分类(递归层级结构)首页 - Python/2020-03-03
-
9
使用python3.7+Vue.js2.0+Django2.0.4异步前端通过api上传文件到七牛云云端存储首页 - Python/2020-02-24
-
10
python3.7.2+Django2.0.4 使用django-celery遇到的那些坑首页 - Python/2019-03-20 1 首先为啥要用celery
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK