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 化的数据。
    • 说明:将创建的对象数据返回给客户端。
相关推荐
喜欢的名字被抢了10 分钟前
Python实战:SQLAlchemy ORM与FastAPI项目集成
开发语言·python·sql·教程·fastapi
夏季疯2 小时前
读论文:STARS 是什么结构?一个统一的歌声自动标注框架
python
遨游DATA2 小时前
Spring Boot 启动失败排查:如何区分多 Bean 冲突与清理阶段异常
java·spring boot·后端
IT_陈寒2 小时前
Java线程池这个坑我算是踩明白了
前端·人工智能·后端
掉头发的王富贵2 小时前
我来入职新公司两个月了,为什么只写了100行代码?
后端·ai编程
从零开始的代码生活_2 小时前
C++ 内存管理:从内存分区到 new/delete 底层原理
开发语言·c++·后端
31535669133 小时前
Superpowers:GPT-5.6 时代下的流程毒瘤
前端·后端
光测实验室3 小时前
3种Python降噪算法实测:我把处理速度提升了20倍
python
AOwhisky3 小时前
Python 学习笔记(第三期)——流程控制核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发·流程控制
爱吃提升3 小时前
Python桌面自动化PyAutoGUI完整实战教程:模拟鼠标键盘、窗口操作、图形识别自动化
python·自动化·计算机外设