使用Django REST Framework POST数据时返回HTTP 400 Bad Request错误如何解决
Django REST Framework POST 400错误排查解决步骤
- 第一步:修复视图错误返回逻辑,获取具体报错信息
你当前的视图代码在序列化器验证失败时,返回的是序列化器的data而非错误详情,无法定位问题。修改视图代码如下:
@api_view(['POST']) def insert_member(request): if request.method == "POST": member_serializer = MemberSerializer(data=request.data) if member_serializer.is_valid(): member_serializer.save() return Response(member_serializer.data,status=201) # 验证失败返回错误信息,而非空data return Response(member_serializer.errors,status=400)
修改后重新发起请求,即可在响应体中看到具体是哪个字段验证失败,针对性解决。
- 第二步:检查日期格式兼容性
Django REST Framework默认的日期输入格式为YYYY-MM-DD,你提交的日期为DD-MM-YYYY格式,大概率会触发验证失败。如果需要支持该格式,修改序列化器,指定日期字段的输入格式:
from rest_framework import serializers from .models import Member class MemberSerializer(serializers.ModelSerializer): # 自定义日期字段的输入输出格式 start_date = serializers.DateField(format="%d-%m-%Y", input_formats=["%d-%m-%Y", "%Y-%m-%d"]) end_date = serializers.DateField(format="%d-%m-%Y", input_formats=["%d-%m-%Y", "%Y-%m-%d"]) class Meta: model = Member fields = '__all__' # 可选:设置id为只读,不需要前端提交 read_only_fields = ['id']
第三步:检查主键提交逻辑
如果你的Member模型的id字段是自增主键,前端提交POST请求时不需要携带id参数,数据库会自动生成,多余的id参数如果存在重复或者不符合字段约束也会触发验证错误,可以直接删掉请求体中的id字段。第四步:检查模型字段约束
核对Member模型的字段定义:
- 是否存在必填字段未在请求体中提交,且模型未设置默认值、不允许为空
email字段是否设置了unique=True,当前提交的邮箱是否已经存在于数据库中- 字段长度限制是否符合,比如
first_name的max_length是否小于你提交的内容长度
- 第五步:检查请求头配置
使用jQuery发送JSON格式的POST请求时,需要显式设置Content-Type为application/json,同时将请求数据转为JSON字符串,示例代码:
$.ajax({ url: 'http://127.0.0.1:8000/newmember/', type: 'POST', contentType: 'application/json; charset=utf-8', data: JSON.stringify({ "first_name": "paul", "last_name": "scholes", "discipline": "football", "start_date": "01-01-2000", "end_date": "01-01-2012", "email": "paulscholes@gmail.com" }), success: function(res) { console.log(res) }, error: function(err) { console.log(err.responseJSON) } })
内容的提问来源于stack exchange,提问作者zmiti atef
相关产品推荐
相关产品推荐

