Django REST framework(DRF)在处理不同请求方法时的完整流程

文章目录

  • [一、POST 请求创建对象的流程](#一、POST 请求创建对象的流程)
  • [二、GET 请求获取对象列表的流程](#二、GET 请求获取对象列表的流程)
  • [三、GET 请求获取单个对象的流程](#三、GET 请求获取单个对象的流程)
  • [四、PUT/PATCH 请求更新对象的流程](#四、PUT/PATCH 请求更新对象的流程)
  • 五、自定义方法的流程
    • [自定义 GET 方法](#自定义 GET 方法)
    • [自定义 POST 方法](#自定义 POST 方法)

一、POST 请求创建对象的流程

  1. 请求到达视图层

    • 方法调用: dispatch
    • 说明: DRF 的视图集接收到请求,dispatch 方法根据请求方法将请求分发到对应的处理方法(如 create)。
  2. 初始化请求

    • 方法调用: initial
    • 说明: 执行认证、权限检查、限流等操作。
  3. 调用视图的 create 方法

    • 方法调用: create
    • 说明: 根据请求,进入视图集的 create 方法处理创建逻辑。
  4. 获取序列化器并传入数据

    • 方法调用: get_serializer(data=request.data)
    • 说明: 实例化序列化器,将请求数据传入。
  5. 序列化器验证数据

    • 方法调用: is_valid(raise_exception=True)
    • 过程:
      • to_internal_value: 将输入数据转换为内部 Python 表示。
      • 字段验证: 对每个字段执行验证,如类型、格式等。
      • 对象级验证: 执行序列化器的 validate 方法,进行跨字段验证。
  6. 保存数据(调用序列化器的 create 方法)

    • 方法调用: save()
      • 内部调用: create(validated_data)
    • 说明: 数据验证通过后,调用 save 方法,进而调用序列化器的 create 方法,使用验证后的数据创建对象。
  7. 额外的操作(调用视图的 perform_create 方法)

    • 方法调用 perform_create()
    • 说明:在创建一个新的模型实例时执行额外的操作。
  8. 返回响应

    • 方法调用: Response(serializer.data, status=201)
    • 过程:
      • to_representation: 将对象数据序列化为可返回的格式。
    • 说明: 视图返回包含序列化数据的响应。

二、GET 请求获取对象列表的流程

  1. 请求到达视图层

    • 方法调用: dispatch
    • 说明: 请求被分发到视图的 list 方法。
  2. 初始化请求

    • 方法调用: initial
    • 说明: 执行认证、权限检查、限流等。
  3. 调用视图的 list 方法

    • 方法调用: list
    • 说明: 处理获取列表的逻辑。
  4. 获取查询集

    • 方法调用: get_queryset
    • 说明: 获取需要展示的对象集合。
  5. 过滤查询集

    • 方法调用: filter_queryset(queryset)
    • 说明: 根据过滤条件筛选数据。
  6. 分页(如果设置了分页器)

    • 方法调用: paginate_queryset(queryset)
    • 说明: 对查询集进行分页处理。
  7. 获取序列化器并序列化数据

    • 方法调用: get_serializer(instance=queryset, many=True)
    • 过程:
      • to_representation: 遍历查询集,对每个对象进行序列化。
    • 说明: 将对象数据转换为可返回的格式。
  8. 返回响应

    • 方法调用: Response(serializer.data)
    • 说明: 返回包含序列化数据的响应。

三、GET 请求获取单个对象的流程

  1. 请求到达视图层

    • 方法调用: dispatch
    • 说明: 请求被分发到视图的 retrieve 方法。
  2. 初始化请求

    • 方法调用: initial
    • 说明: 执行认证、权限检查、限流等。
  3. 调用视图的 retrieve 方法

    • 方法调用: retrieve
    • 说明: 处理获取对象详情的逻辑。
  4. 获取对象实例

    • 方法调用: get_object
      • 内部调用: get_queryset 和 filter_queryset
    • 说明: 根据 pk 或其他标识符获取单个对象。
  5. 获取序列化器并序列化数据

    • 方法调用: get_serializer(instance=object)
    • 过程:
      • to_representation: 将对象数据序列化。
    • 说明: 将对象转换为可返回的格式。
  6. 返回响应

    • 方法调用: Response(serializer.data)
    • 说明: 返回包含对象数据的响应。

四、PUT/PATCH 请求更新对象的流程

  1. 请求到达视图层

    • 方法调用: dispatch
  2. 初始化请求

    • 方法调用: initial
  3. 调用视图的 update 方法

    • 方法调用: update(PUT)或 partial_update(PATCH)
  4. 获取对象实例

    • 方法调用: get_object
  5. 获取序列化器并传入数据和实例

    • 方法调用: get_serializer(instance=object, data=request.data, partial=partial)
    • 说明: partial 参数决定是否允许部分更新。
  6. 序列化器验证数据

    • 方法调用: is_valid(raise_exception=True)
  7. 保存数据(调用序列化器的 update 方法)

    • 方法调用: save()
    • 内部调用: update(instance, validated_data)
  8. 返回响应

    • 方法调用: Response(serializer.data)

五、自定义方法的流程

自定义 GET 方法

  1. 请求到达视图层

    • 方法调用:dispatch
    • 说明:DRF 的视图接收到请求,dispatch 方法根据请求方法和路由信息,将请求分发到对应的处理方法。
  2. 初始化请求

    • 方法调用:initial
    • 说明:进行认证、权限检查和限流等操作。
  3. 调用自定义方法

    • 方法调用:custom_get
    • 说明:执行自定义的逻辑。由于这是一个 GET 请求,通常不会涉及数据的修改或序列化器的使用。
  4. 返回响应

    • 方法调用:Response
    • 说明:将处理结果封装在 Response 对象中,返回给客户端。

注意:在这个过程中,不会涉及序列化器的方法调用,除非您在自定义方法中主动使用序列化器。

自定义 POST 方法

  1. 请求到达视图层

    • 方法调用:dispatch
  2. 初始化请求

    • 方法调用:initial
  3. 调用自定义方法

    • 方法调用:custom_post
  4. 获取序列化器并传入数据

    • 方法调用:get_serializer(data=request.data)
    • 说明:实例化序列化器,用于数据验证和保存。
  5. 序列化器验证数据

    • 方法调用:is_valid(raise_exception=True)
    • 过程:
      • to_internal_value:将输入的数据转换为内部 Python 数据类型。
      • 字段验证:验证各个字段的有效性。
      • validate 方法:执行对象级别的验证。
  6. 保存数据

    • 方法调用:perform_create(serializer)

      • 内部调用:serializer.save()
    • 说明:调用序列化器的 save 方法,进而调用 create 方法,将数据保存到数据库。

  7. 序列化器保存数据

    • 方法调用:create(validated_data)
    • 说明:使用经过验证的数据创建新的对象实例。
  8. 返回响应

    • 方法调用:Response(serializer.data, status=201)
    • 过程:
      • to_representation:将创建的对象实例序列化为可 JSON 化的数据。
    • 说明:将创建的对象数据返回给客户端。
相关推荐
薛定谔的猫喵喵4 小时前
天然气压力能利用系统综合性评价平台:基于Python和PyQt5的AHP与模糊综合评价集成应用
开发语言·python·qt
yuluo_YX4 小时前
Reactive 编程 - Java Reactor
java·python·apache
独好紫罗兰4 小时前
对python的再认识-基于数据结构进行-a004-列表-实用事务
开发语言·数据结构·python
ZH15455891314 小时前
Flutter for OpenHarmony Python学习助手实战:模块与包管理的实现
python·学习·flutter
choke2334 小时前
[特殊字符] Python异常处理
开发语言·python
神奇小汤圆4 小时前
浅析二叉树、B树、B+树和MySQL索引底层原理
后端
文艺理科生5 小时前
Nginx 路径映射深度解析:从本地开发到生产交付的底层哲学
前端·后端·架构
千寻girling5 小时前
主管:”人家 Node 框架都用 Nest.js 了 , 你怎么还在用 Express ?“
前端·后端·面试
南极企鹅5 小时前
springBoot项目有几个端口
java·spring boot·后端
Luke君607975 小时前
Spring Flux方法总结
后端