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

已设null和blank=True仍触发NOT NULL约束失败问题排查

问题分析与修复方案

问题根源

  1. 序列化器忽略user字段:你的ProfileSerializer中user = UserSerializer(read_only=True),read_only=True会让序列化器在处理POST请求的输入数据时完全跳过该字段——哪怕你往request.data里塞了user值,序列化器也不会将其纳入验证和保存流程。
  2. 模型非空约束触发: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:35:10