已设null和blank=True仍触发NOT NULL约束失败问题排查
问题分析与修复方案
问题根源
- 序列化器忽略user字段:你的
ProfileSerializer中user = UserSerializer(read_only=True),read_only=True会让序列化器在处理POST请求的输入数据时完全跳过该字段——哪怕你往request.data里塞了user值,序列化器也不会将其纳入验证和保存流程。 - 模型非空约束触发:
Profile模型的user字段未设置null=True(代码中确实未添加该配置),因此保存时必须传入有效值,否则直接触发NOT NULL constraint failed错误。
修复方案(推荐)
直接在序列化器保存时传入当前用户,无需修改request.data,逻辑更简洁可靠:
def create(self, request): serializer = ProfileSerializer(data=request.data) if serializer.is_valid(): # 直接将当前用户传入save方法,序列化器会自动处理关联 serializer.save(user=request.user) data = serializer.data return Response(data, status=status.HTTP_201_CREATED) else: return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
补充方案(可选)
如果需要保留修改request.data的方式,可调整序列化器,新增一个只写的user_id字段用于接收输入:
class ProfileSerializer(WritableNestedModelSerializer, serializers.ModelSerializer): # 用于输出的嵌套用户信息(只读) user = UserSerializer(read_only=True) # 用于输入的用户ID(只写) user_id = serializers.UUIDField(write_only=True) gym = GymSerializer(read_only=True) class Meta: model = Profile fields = '__all__' depth = 1
视图中修改为:
def create(self, request): request.data['user_id'] = request.user.id serializer = ProfileSerializer(data=request.data) # 后续验证、保存逻辑不变
内容的提问来源于stack exchange,提问作者rafaelHTML
相关产品推荐
相关产品推荐

