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 化的数据。
    • 说明:将创建的对象数据返回给客户端。
相关推荐
用户818187062746几秒前
第26章 Kafka vs RocketMQ vs RabbitMQ真实选型对比
java·后端
小叶肥辉1 分钟前
LangChain链和LangGraph图的学习笔记【四】——(1)调用方法:invoke(2)提示语模板:PromptTemplate
python·langchain·prompt
小兔崽子去哪了11 分钟前
深度学习 2 / CNN 神经网络
后端·python
weixin_4407305020 分钟前
队列QUEUE介绍+类型示例(先进先出、后进先出、优先级高先出、双端进入、生产者+消费者线程)
python·线程·queue
这是程序猿23 分钟前
Java线程池深度剖析:源码原理、核心参数、任务调度与生产调优实战
java·开发语言·python
rannn_11125 分钟前
【Java面试八股】Java基础篇|数据类型、面向对象、关键字、反射、注解、异常、新特性、序列化、设计模式、IO
java·后端·面试
Web3&Basketball28 分钟前
ChatGPT 路由自证:跨客户端实测对照
python·大模型·agent·推理·推理优化
Patrick在香港29 分钟前
Claude 工作提醒自动化:香港天文台四个接口三个「更新时间」,警告到期了却还在生效
python·api·claude·数据抓取·香港
用户83562907805134 分钟前
Python 实现 Word 文档域的插入与管理
后端·python
quantdash_cc35 分钟前
从数据采集到策略消费,股票日内行情管道应该怎么设计?
开发语言·python·数据分析·量化交易·股票数据·quantdash