文章目录
一、POST 请求创建对象的流程
请求到达视图层
- 方法调用: dispatch
- 说明: DRF 的视图集接收到请求,dispatch 方法根据请求方法将请求分发到对应的处理方法(如 create)。
初始化请求
- 方法调用: initial
- 说明: 执行认证、权限检查、限流等操作。
调用视图的 create 方法
- 方法调用: create
- 说明: 根据请求,进入视图集的 create 方法处理创建逻辑。
获取序列化器并传入数据
- 方法调用: get_serializer(data=request.data)
- 说明: 实例化序列化器,将请求数据传入。
序列化器验证数据
- 方法调用: is_valid(raise_exception=True)
- 过程:
- to_internal_value: 将输入数据转换为内部 Python 表示。
- 字段验证: 对每个字段执行验证,如类型、格式等。
- 对象级验证: 执行序列化器的 validate 方法,进行跨字段验证。
保存数据(调用序列化器的 create 方法)
- 方法调用: save()
- 内部调用: create(validated_data)
- 说明: 数据验证通过后,调用 save 方法,进而调用序列化器的 create 方法,使用验证后的数据创建对象。
- 方法调用: save()
额外的操作(调用视图的 perform_create 方法)
- 方法调用 perform_create()
- 说明:在创建一个新的模型实例时执行额外的操作。
返回响应
- 方法调用: Response(serializer.data, status=201)
- 过程:
- to_representation: 将对象数据序列化为可返回的格式。
- 说明: 视图返回包含序列化数据的响应。
二、GET 请求获取对象列表的流程
请求到达视图层
- 方法调用: dispatch
- 说明: 请求被分发到视图的 list 方法。
初始化请求
- 方法调用: initial
- 说明: 执行认证、权限检查、限流等。
调用视图的 list 方法
- 方法调用: list
- 说明: 处理获取列表的逻辑。
获取查询集
- 方法调用: get_queryset
- 说明: 获取需要展示的对象集合。
过滤查询集
- 方法调用: filter_queryset(queryset)
- 说明: 根据过滤条件筛选数据。
分页(如果设置了分页器)
- 方法调用: paginate_queryset(queryset)
- 说明: 对查询集进行分页处理。
获取序列化器并序列化数据
- 方法调用: get_serializer(instance=queryset, many=True)
- 过程:
- to_representation: 遍历查询集,对每个对象进行序列化。
- 说明: 将对象数据转换为可返回的格式。
返回响应
- 方法调用: Response(serializer.data)
- 说明: 返回包含序列化数据的响应。
三、GET 请求获取单个对象的流程
请求到达视图层
- 方法调用: dispatch
- 说明: 请求被分发到视图的 retrieve 方法。
初始化请求
- 方法调用: initial
- 说明: 执行认证、权限检查、限流等。
调用视图的 retrieve 方法
- 方法调用: retrieve
- 说明: 处理获取对象详情的逻辑。
获取对象实例
- 方法调用: get_object
- 内部调用: get_queryset 和 filter_queryset
- 说明: 根据 pk 或其他标识符获取单个对象。
- 方法调用: get_object
获取序列化器并序列化数据
- 方法调用: get_serializer(instance=object)
- 过程:
- to_representation: 将对象数据序列化。
- 说明: 将对象转换为可返回的格式。
返回响应
- 方法调用: Response(serializer.data)
- 说明: 返回包含对象数据的响应。
四、PUT/PATCH 请求更新对象的流程
请求到达视图层
- 方法调用: dispatch
初始化请求
- 方法调用: initial
调用视图的 update 方法
- 方法调用: update(PUT)或 partial_update(PATCH)
获取对象实例
- 方法调用: get_object
获取序列化器并传入数据和实例
- 方法调用: get_serializer(instance=object, data=request.data, partial=partial)
- 说明: partial 参数决定是否允许部分更新。
序列化器验证数据
- 方法调用: is_valid(raise_exception=True)
保存数据(调用序列化器的 update 方法)
- 方法调用: save()
- 内部调用: update(instance, validated_data)
返回响应
- 方法调用: Response(serializer.data)
五、自定义方法的流程
自定义 GET 方法
请求到达视图层
- 方法调用:dispatch
- 说明:DRF 的视图接收到请求,dispatch 方法根据请求方法和路由信息,将请求分发到对应的处理方法。
初始化请求
- 方法调用:initial
- 说明:进行认证、权限检查和限流等操作。
调用自定义方法
- 方法调用:custom_get
- 说明:执行自定义的逻辑。由于这是一个 GET 请求,通常不会涉及数据的修改或序列化器的使用。
返回响应
- 方法调用:Response
- 说明:将处理结果封装在 Response 对象中,返回给客户端。
注意:在这个过程中,不会涉及序列化器的方法调用,除非您在自定义方法中主动使用序列化器。
自定义 POST 方法
请求到达视图层
- 方法调用:dispatch
初始化请求
- 方法调用:initial
调用自定义方法
- 方法调用:custom_post
获取序列化器并传入数据
- 方法调用:get_serializer(data=request.data)
- 说明:实例化序列化器,用于数据验证和保存。
序列化器验证数据
- 方法调用:is_valid(raise_exception=True)
- 过程:
- to_internal_value:将输入的数据转换为内部 Python 数据类型。
- 字段验证:验证各个字段的有效性。
- validate 方法:执行对象级别的验证。
保存数据
方法调用:perform_create(serializer)
- 内部调用:serializer.save()
说明:调用序列化器的 save 方法,进而调用 create 方法,将数据保存到数据库。
序列化器保存数据
- 方法调用:create(validated_data)
- 说明:使用经过验证的数据创建新的对象实例。
返回响应
- 方法调用:Response(serializer.data, status=201)
- 过程:
- to_representation:将创建的对象实例序列化为可 JSON 化的数据。
- 说明:将创建的对象数据返回给客户端。