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

Django DRF POST接口提交数据无法写入数据库问题排查

Django DRF 自定义接口无法写入数据问题定位

核心错误原因

你的代码存在3处问题,直接导致数据无法入库:

  • 序列化器入参格式错误
    DRF框架会自动解析POST请求的JSON格式请求体,解析完成的Python字典直接存放在request.data属性中,不需要手动调用json.dumps()转成JSON字符串。序列化器的data参数只接收Python字典/类字典对象,传入JSON字符串时无法识别任何字段,is_valid()会直接返回False,不会执行后续的save()入库逻辑。
  • URL字段值不符合校验规则
    模型中的URLField会强制校验传入值为带协议头(http/https等)的合法URL,你提交的amazon.com/books/5缺少协议前缀,即使修正了序列化器入参问题,这里也会触发校验失败。
  • 视图缺少错误反馈逻辑
    当前代码无论序列化器校验是否通过,都返回200状态码和空的序列化结果,没有返回校验错误信息,导致无法直接定位失败原因。

修正方案

1. 修正视图函数代码

from rest_framework import status
from rest_framework.response import Response
from rest_framework.decorators import api_view
from .serializers import CurrentBestSellersListItemSerializer

@api_view(['POST'])
def create_saved_list_item(request): 
    # 直接传入request.data即可,不需要做JSON转换
    serializer = CurrentBestSellersListItemSerializer(data=request.data)
    # 校验失败时返回400状态码和具体错误信息
    if not serializer.is_valid():
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    serializer.save()
    # 创建成功返回201状态码和生成的实例数据
    return Response(serializer.data, status=status.HTTP_201_CREATED)

2. 修正提交的POST数据

给URL字段补上协议头:

{
    "rank": 555, 
    "weeks_on_list": 555, 
    "publisher": "a", 
    "description": "b", 
    "title": "c", 
    "author": "d",
    "amazon_product_url": "https://amazon.com/books/5"
}

验证说明

修正后重新发起请求,如果参数正确会返回201状态码和写入数据库的完整数据,数据库中也能查到对应记录;如果参数有误,会直接返回400状态码和具体的字段错误提示,方便排查问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 08:45:32