使用Django REST Framework发送PUT请求返回200,GET请求中car_year字段为null
问题排查与解决
可能的原因及对应解决方法
1. PUT请求未携带car_year字段
DRF的UpdateModelMixin默认使用全量更新(partial=False),也就是PUT请求必须包含所有必填字段。如果你的模型中car_year没有设置允许为空,但数据库实际允许该字段为null(比如之前迁移时默认设置),那么PUT时没传该字段会导致它被设为null。
- 解决:
- 确保Postman发送PUT请求时,请求体里包含
car_year字段,且值为有效整数(比如2020)。 - 如果需要支持部分更新(不需要传所有字段),可以修改视图的
put方法,启用部分更新:
不过更规范的做法是用PATCH请求来做部分更新,PUT保留全量更新的语义。def put(self,request,id=None): return self.update(request,id, partial=True)
- 确保Postman发送PUT请求时,请求体里包含
2. 模型字段配置问题
你的car_year字段用了IntegerField(max_length=None),但max_length参数对IntegerField完全无效,属于冗余配置。另外,如果允许car_year为空,需要显式配置:
car_year=models.IntegerField(null=True, blank=True)
如果不允许为空,就不要加null=True和blank=True,这样序列化器会强制要求PUT请求携带该字段,否则返回验证错误。
3. 数据库迁移未同步
如果是后来才给Driver模型添加的car_year字段,迁移时如果没有设置默认值或允许null,数据库会拒绝迁移。可能你当时默认允许了null,导致数据库中该字段实际允许为空,所以PUT时没传值就会被设为null。
- 解决:
- 确认模型配置和数据库实际字段属性一致,重新执行迁移命令:
python manage.py makemigrations python manage.py migrate
- 确认模型配置和数据库实际字段属性一致,重新执行迁移命令:
4. 模型__str__方法语法错误
你提供的代码里,__str__方法的return语句没有缩进,这会导致语法错误,影响模型的正常使用。修正为:
def __str__(self): return self.name
内容的提问来源于stack exchange,提问作者gorge
相关产品推荐
相关产品推荐

