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
相关产品推荐
相关产品推荐

