Restframework之CreateApiview源码流程
1.接口代码调用流程
#1.入口,子类继承CreateAPIView
class IssueIdea(CreateAPIView):
pass
#2.调用 CreateAPIView.post
class CreateAPIView(mixins.CreateModelMixin,GenericAPIView):
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
#3.post调用create方法,根据继承顺序执行CreateModelMixin.create
def perform_create(self, serializer):
#校验成功后保存
serializer.save()
def get_success_headers(self, data):
def create(self, request, *args, **kwargs):
...
#4.CreateModelMixin.create
#4.1 将前端数据传入序列化器进行校验
#GenericAPIView,返回序列化器类名
def get_serializer(self, *args, **kwargs):
....
return self.serializer_class #子类需要定义序列化器
#校验
serializer = self.get_serializer(data=request.data)
#4.2 验证成功保存数据
#传入序列化器进行保存
self.perform_create(serializer)
#调用CreateModelMixin.perform_create保存
def perform_create(self, serializer): #!子类可重写此方法自定义保存
serializer.save()
#4.2.1 序列化器 save方法
save():
self.create(validated_data) #create子类需要自定义,否则抛出异常(在此方法中自定义保存)
#5.serializer.create
#调用自定义的序列化器create方法进行保存
2.序列化器
class CreateNewsTopicModelSerializer(serializers.ModelSerializer):
...
class CreateNewsModelSerializer(serializers.ModelSerializer):
images = CreateNewsTopicModelSerializer(many=True)#嵌套序列化器,需要验证多个对象
class Meta:...
def create(self, validated_data):
#自定义保存,此校验涉及两张表,需要保存两个对象,可在create方法中自定义保存。
return news_obj #response返回值
简单梳理下调用流程:
1.子类继承CreateApiview((mixins.CreateModelMixin,GenericAPIView)
1.1 请求进来调用CreateApiview.post方法
1.1.1 post方法调用父类 CreateModelMixincreate.create
1.1.1.1 CreateModelMixincreate.create
-- 1.调用 GenericAPIView.get_serializer(将前端数据传入序列化器进行校验)
-- get_serializer 获取 子类序列化器类名
-- 2.调用 CreateModelMixincreate.perform_create
-- perform_create
-- 调用serializer.save(**kwargs) ##save函数:将所有字段的数据放在validated_data用于create保存
-- save调用create方法(如果需要保存多个表对象,子类序列化器可自定义)
-- create方法自定义保存数据
使用
如果不需要添加额外字段,视图子类只需要定义
[serializer_class = 自定义序列化器]就可保存数据
4.前端传递json
若前端传递格式为{
K1:V1,
K2:{} or [] ##此字段可使用嵌套序列化器
}
预留钩子,可自定制
1.post方法可自定义(处理post请求)
def post(self, request, *args, **kwargs):
......自定义操作
return self.create(request, *args, **kwargs) #必须调用create方法
2.perform_create(调用save方法)
def perform_create(self, serializer):
"传入序列化器,在调用serializer.save"
new_obj = serializer.save(**kwargs) #此处可传入表中的特殊字段值
return new_obj
3. 序列化器
3.1 serializer.save(**kwargs) #(封装用于保存的所有字段)
#save中validated_data封装了 {
list(self.validated_data.items()) + //验证 通过的字段
list(kwargs.items()) ) //save传入的额外字段(**kwargs)
}
3.2 serializer.create(真正保存数据步骤,子类必须重写)
def create(self, validated_data):
#自定义部分......
#执行orm创建数据操作时,传入的是 validated_data
return Response(返回值)
4. 获取序列化器种类
若接口接受两种请求,子类重写self.get_serializer方法根据请求种类来获取不同序列化器
get_serializer(self,request):
if request.method = "post":
return ..
if request.method = "post":
return ..
孤独中保持善良

浙公网安备 33010602011771号