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

Django Rest Framework POST接口无法正常写入有效数据求助

问题排查与解决方案

1. 检查Postman请求格式与字段匹配

  • 用JSON格式请求时:必须把请求头Content-Type设为application/json,且JSON键名要和模型字段名完全一致(区分大小写,比如模型里是name,不能写成Name或company_name)。示例正确JSON:
{
    "code": "COMP001",
    "name": "Test Company",
    "address": "123 Main St",
    "city": "New York",
    "country": "USA",
    "status": "Active"
}
  • 用form-data格式上传图片时:非文件字段类型设为Text,文件字段设为File,所有字段名严格匹配模型字段。注意:form-data请求无需手动设置Content-Type,Postman会自动处理。

2. 验证序列化器接收的数据

在视图里加打印语句,确认请求数据是否正确传递:

@api_view(['POST',]) 
def create_company(request):
    print("Received data:", request.data)  # 打印接收到的原始数据
    serializer = CompaniesSerializer(data=request.data)
    if request.method == "POST":
        if serializer.is_valid(raise_exception=True):
            print("Validated data:", serializer.validated_data)  # 打印验证后的数据
            company_saved = serializer.save()
        return Response({"success": "Company '{}' created successfully".format(company_saved.name)})

运行服务后看控制台输出:如果request.data里没有你传的字段,说明请求格式或字段名错了;如果request.data有但serializer.validated_data没有,说明字段验证失败(raise_exception=True会直接抛错,能看到具体原因)。

3. 修正模型字段的不必要null=True

你模型里很多核心字段(比如name)加了null=True,这会导致前端不传值时数据库也允许存null。如果name是必填项,直接去掉null=True:

# models.py修改name字段
name = models.CharField(max_length=100, unique=True, verbose_name='Company Name ')

这样前端不传name的话,序列化器会直接抛出验证错误,方便快速定位问题。

4. 处理图片上传依赖与配置

因为用了ImageField,先确保安装了Pillow:

pip install pillow

然后在settings.py配置媒体文件路径:

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

最后在根URL中添加媒体文件路由:

from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... 其他路由
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

5. 修正视图逻辑缩进问题

你视图里的return Response缩进有误,应该放在验证通过的代码块内,同时处理非POST请求:

@api_view(['POST',]) 
def create_company(request):
    serializer = CompaniesSerializer(data=request.data)
    if request.method == "POST":
        if serializer.is_valid(raise_exception=True):
            company_saved = serializer.save()
            return Response({"success": "Company '{}' created successfully".format(company_saved.name)})
    return Response({"error": "Only POST requests are allowed"}, status=status.HTTP_405_METHOD_NOT_ALLOWED)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 16:46:17