You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DRF中接收POST请求并实现数据映射转发?

问题描述

我在DRF中编写了POST类型接口 path('api/v1/lead',CreateLeadAPI.as_view()),计划通过Postman向该接口发送POST请求,希望Python接收JSON数据,完成数据映射后转发至另一个接口。但目前无法解决POST请求的数据接收问题,同时想了解正确的数据映射方法。相关代码如下:

class CreateLeadAPI(generics.ListCreateAPIView):
    queryset = LeadId.objects.all()
    serializer_class = APISerializer

解决方案

一、解决POST JSON数据接收问题

DRF的ListCreateAPIView本身支持解析JSON请求,但需满足以下前提:

  • Postman请求必须携带请求头 Content-Type: application/json,否则DRF不会将请求体解析为JSON格式
  • 你的APISerializer字段需与请求JSON的字段对应,若无需将数据存入LeadId模型(仅做转发用),建议改用APIView,避免模型绑定带来的限制

基础接收示例(改用APIView):

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

class CreateLeadAPI(APIView):
    def post(self, request, *args, **kwargs):
        # 直接通过request.data获取解析后的JSON数据
        received_data = request.data
        # 后续处理逻辑
        return Response({"received_data": received_data}, status=status.HTTP_200_OK)

二、数据映射的正确方法

数据映射核心是将源JSON字段转换为目标接口所需的字段格式,常用实现方式:

  1. 定义字段映射规则字典,明确源字段与目标字段的对应关系
  2. 遍历源数据,按规则生成符合要求的目标数据

示例代码:

# 假设收到的源JSON格式:
# {"user_name": "张三", "user_email": "zhangsan@example.com", "phone": "13800138000"}
# 目标接口要求的格式:
# {"name": "", "email": "", "contact_number": ""}

def map_source_to_target(source_data):
    # 定义字段映射规则
    field_mapping = {
        "user_name": "name",
        "user_email": "email",
        "phone": "contact_number"
    }
    target_data = {}
    for source_key, target_key in field_mapping.items():
        # 处理源字段缺失的情况,可设置默认值或跳过
        target_data[target_key] = source_data.get(source_key, "")
    # 可额外添加固定字段或复杂转换逻辑
    target_data["created_at"] = timezone.now().isoformat()
    return target_data

# 在视图的post方法中调用映射函数
mapped_data = map_source_to_target(received_data)

三、转发数据至目标接口

使用requests库向目标接口发送POST请求,先执行安装命令:

pip install requests

整合转发逻辑的视图示例:

import requests
from django.conf import settings
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

def forward_to_target(mapped_data):
    # 建议在settings.py中配置目标接口地址
    target_api_url = settings.TARGET_API_ENDPOINT
    try:
        response = requests.post(target_api_url, json=mapped_data)
        response.raise_for_status()  # 捕获HTTP请求错误
        return response.json()
    except requests.exceptions.RequestException as e:
        # 异常处理:记录日志或返回错误信息
        return {"error": str(e)}

class CreateLeadAPI(APIView):
    def post(self, request, *args, **kwargs):
        received_data = request.data
        # 数据映射
        mapped_data = map_source_to_target(received_data)
        # 转发数据
        forward_result = forward_to_target(mapped_data)
        # 返回结果给Postman
        return Response(
            {"status": "processed", "forward_response": forward_result},
            status=status.HTTP_200_OK
        )

注意事项

  • 若坚持使用ListCreateAPIView,可重写序列化器的create方法,在其中完成映射与转发,但灵活性不如APIView
  • 必须添加异常处理逻辑,覆盖请求数据缺失、目标接口不可达等场景
  • 建议添加日志记录,便于排查接收、映射、转发各环节的问题

内容的提问来源于stack exchange,提问作者Dias

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:30:53