海口哪里做网站公司,网站建设背景分析论文,传奇辅助网站怎么做,免费网站下载直播软件Django rest_framework Serializer中的create、Views中的create/perform_create的区别 对于后端来说#xff0c;前后端分离的方式能让前后端的开发都爽。和所有的爽一样#xff0c;每爽一次都要付出一定的代价。而前后端分离的代价#xff0c;就是后端要面对巨量的模块化的功…Django rest_framework Serializer中的create、Views中的create/perform_create的区别 对于后端来说前后端分离的方式能让前后端的开发都爽。和所有的爽一样每爽一次都要付出一定的代价。而前后端分离的代价就是后端要面对巨量的模块化的功能组件以及这些组件的常规用法与重写复用。有一点经验关于[Django rest_framework ] Serializer中的create()、Views中的create()/perform_create()的区别希望与诸君共讨之。 1 Serializer 序列化器
1.1 Serializer作用
序列化器是rest_framework 其中的一个组件它有两个功能
序列化把python中的对象转成json/xml格式字符串。这里的对象指的是数据库对象因为rest_framework 用的ORM来操作数据库。它的功能直观上是将数据库里面的数据通过接口传递到前端因为使用ORM的缘故从数据库到接口数据转换的过程被描述成序列化其实更准确的描述应该是[可传输化]或者[转化为可以被前端直接使用的数据类型]这样更便于理解。反序列化把json/xml格式字符串转成python中的对象。从功能上来说反序列化是序列化的逆过程。但同样的从英语到汉语直译的方式总会带来各种理解上的障碍。更准确地描述应该是[字符串对象化]或者[可存储化]。
和前后端不分离相比Serializer承担了一部分views
2.2 Serializer中的create
序列化()的过程一般是read操作绝大多数情况下应该不涉及使用create()。所以Serializer重写create()的情况只能是反序列化(字符串----数据库)也就是将接口数据保存到数据库中。 Serializers中的create()方法
from rest_framework import serializersclass MyModelSerializer(serializers.ModelSerializer):一个序列化器class Meta:model MyModelfields __all__# Serializers中的create()方法def create(self, validated_data):## your codereturn super().create(validated_data)上面的这一小段代码是一个典型的序列化器在这里我们重写了Serializer的create()。可以看到在这里的create()方法有一个validated_data参数这意味着什么呢我想聪明的你已经猜到了答案即这个数据是从前端传过来并且已经过了验证(valide)。经过了谁的验证呢没错是Serializer。可能许多人还记得Serializer提供了很多字段类似models中的字段当时我还在想我说这玩意儿是用来干嘛的呢。现在回首我想很多人像我一样也已豁然开朗。记着永远不要忘记Serializer的功能。举个例子 from rest_framework import serializersclass MyModelSerializer(serializers.ModelSerializer):一个序列化器class Meta:model MyModelfields __all__# Serializers中的create()方法def create(self, validated_data):## your codereturn super().create(validated_data)# 定义的一个字段my_bool BooleanField()上面我定义了一个字段my_bool 。这个字段可接受的值是一个布尔值0/1。如果传其他值则会报错。那么很明显的Serializer中重写create()方法的作用已然显现对Serializer已校验的前端入参进行二次处理。默认情况下serializer处理结束后将会返回一个示例instance给视图(这一点存疑)。
到此Serializer的作用应该是结束了。 2 Views 视图
Serializer将校验成功的数据给到viewsviews拿到数据之后用来做持久化。
2.1 views中的create()与perform_create()
在views中你可以重写create()并通过request.GET/request.POS/request.data拿到从前端传过来并经过Serializer规则校验的数据。 拿到之后呢你可以对这些数据再次进行处理或者将它作为调用其它接口的入参(这就是传说中的对其它系统的接口进行二次封装)。 视图中的create()与序列化器中的create()有一个巨大的区别是视图中的create()可以调用perform_create()进行持久化。这很棒棒因为后端开发说白了就是对数据库进行增删改查(撇开使用不同框架的差异)而增删改查的难易程度事实上取决于你要解决的问题即实际具体业务的复杂程度。 3 总结一下
Serializer主要是和前端打交道so基于这一点你重写Serializer的create()本质是为了过滤。如果通过了校验并且满足你的要求那么它会到视图中做下一步处理(通过过滤)反之将会给前端反馈一些提示信息过去(被过滤)。Views则相反Views主要和后端打交道你重写Views的create()本质是为了持久化。在持久化之前你可以对入参做任何符合实际情况的处理(包括调用其它接口)但是因为是POST/create()最终你还是要持久化(perform_create())。 以上 。