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

发布于:2024-12-21 ⋅ 阅读:(11) ⋅ 点赞:(0)


一、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 化的数据。
    • 说明:将创建的对象数据返回给客户端。

网站公告

今日签到

点亮在社区的每一天
去签到