当前位置: 首页 > 后端技术 > Python

Django+React全栈开发:serializer

时间:2023-03-26 14:16:08 Python

RESTframework继续前面的内容,我们先进入项目文件夹react_drf,激活虚拟环境,安装RESTframework:$sourcevenv/bin/activate//激活后(venv)(venv)$pipinstalldjangorestframeworkDjangoREST框架是一个强大而灵活的工具包,用于构建WebAPI。官方介绍:DjangoRESTframework是一个强大而灵活的WEBAPI构建工具。还记得上一篇文章提到的RESTfulAPI吗?这次我们将尝试使用RESTframework库来改造我们之前写的程序。安装完成后记得在项目文件夹backend/backend/settings.py文件中注册:INSTALLED_APPS=['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','姜戈。contrib.sessions','django.contrib.messages','django.contrib.staticfiles','rest_framework',#添加这个'article.apps.ArticleConfig',]扩展模型打开我们的后端/article/models.py的文件的原始内容有点小。让我们先扩展这个模型:fromdjango.dbimportmodelsclassArticle(models.Model):title=models.CharField(max_length=50)body=models.TextField()created=models.DateTimeField(auto_now_add=True)updated=models.DateTimeField(auto_now=True)classMeta:ordering=('-created',)注意我们定义了继承models.Model的类Article,它和里面的表有对应关系数据库。可以看出,该类的不同属性是不同的对象实例,对应于数据库中表的不同列,代表不同的数据类型。created和updated通过设置两个不同的参数为True实现自动保存创建时间和最后修改时间的功能。这里,在元类中定义为按创建时间降序排序。请注意,排序应该是一个元组,所以不要忘记逗号。好吧,还记得每次更换模型时要做什么吗?(venv)$pythonmanage.pymakemigrationsarticleMigrationsfor'article':article/migrations/0001_initial.py-创建模型Article(venv)$pythonmanage.pymigrateOperationstoperform:Applyallmigrations:admin,article,auth,authtoken,contenttypes,sessionsRunningmigrations:Applyingcontenttypes.0001_initial...OK...Applyingsessions.0001_initial...OK现在迁移完成了,但是现在我们不急着写视图和模板,我们要开始了制作我们自己的RESTfulAPI。Serialization还记得前面说过,REST就是表示层的状态转换。我们需要一个工具来序列化和反序列化模型。通俗地说,序列化就是将语言中的对象转换成可以存储或传输的对象。形式,反序列化是逆过程。在前后端分离模式的开发中,由于前后端语言往往不同,比如后端Java,前端JavaScript,或者是移动端的Kotlin,通常需要更通用的格式,而JSON是一个不错的选择。好了,开始吧,在文章文件夹新建一个serializers.py文件:#article/serializers.pyclassArticleSerializer(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)defcreate(self,validated_data):返回Article.objects.create(**validated_data)def更新(self,instance,validated_data):instance.title=validated_data.get('title',instance.title)instance.body=validated_data.get('body',instance.title)instance.save()returninstance由于TextField是Django为大文本内容定义的扩展字段,所以在rest_framework中只能用CharField序列化。覆盖创建和更新方法以定义调用serializer.save()时的行为。参数required=True表示必须,read_only=True表示只读。shellDjango为我们提供了一个交互式调试环境,输入命令pythonmanage.pyshell命令进入交互式环境。让我们来看看序列化一个Article实例:>>>fromarticle.modelsimportArticle>>>fromarticle.serializersimportArticleSerializer>>>fromrest_framework.renderersimportJSONRenderer>>>fromrest_framework.parsersimportJSONParser>>>article=Article(title="React",body="Reactisgood")>>>article.save()>>>serializer=ArticleSerializer(article)>>>serializer.data{'id':2,'title':'React','body':'Reactisgood','created':'2020-03-21T21:19:31.732703','updated':'2020-03-21T21:19:31.732728'}通过序列之前renderer将实例序列化为Python内置的字典类型,现在看将其转换为JSON:>>>content=JSONRenderer().render(serializer.data)>>>contentb'{"id":2,"title":"React","body":"React很好","created":"2020-03-21T21:19:31.732703","updated":"2020-03-21T21:19:31.732728"}'反序列化与上面类似,但相反:>>>importio>>>stream=io.BytesIO(content)>>>data=JSONParser().parse(stream)>>>serializer=ArticleSerializer(data=data)>>>serializer.is_valid()True>>>serializer.validated_dataOrderedDict([('title','React'),('body','Reactisgood')])>>>serializer.save()#这里是3因为我原来保存了一个数据ModelSerializerREST框架为我们提供了一种更简洁的序列化器编写方式:#修改原来的ArticleSerializer类classArticleSerializer(serializers.ModelSerializer):classMeta:model=Articlefields=['id','title','body','created','updated']可以交互方式查看:>>>fromarticle.序列化程序导入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类型的主体进行了特殊处理,定义了将其呈现为HTML时的格式。如果你熟悉Django原生的表单,你会发现这个Serializer和原生的Form非常相似。总结现在我们已经熟悉了序列化和反序列化,在下一篇文章中我们将为我们的API编写一个新的视图。扫描二维码关注龚自政宅家日常,第一时间查看最新推送: