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

Django DRF POST接口报错NOT NULL constraint failed: accounts_personalcolor.user_id求助

报错根因

你遇到的NOT NULL constraint failed: accounts_personalcolor.user_id报错和主键自增id无关,核心原因是Personalcolor对应的数据表存在user_id非空字段,你保存数据时没有给该字段赋值,触发了数据库非空约束。你贴出的模型代码没有声明user字段,说明模型代码和实际数据库表结构不一致,或者你漏写了模型的用户关联字段。

解决步骤

  • 第一步:核对模型与数据库结构
    你可以先查看数据库中accounts_personalcolor表的字段,确认user_id字段是否是业务需要的字段:

    • 如果不需要关联用户:删除表中的user_id字段,执行python manage.py makemigrations和python manage.py migrate同步数据库结构即可
    • 如果需要关联提交请求的用户:在模型中补全用户关联字段,示例如下:
    from django.contrib.auth.models import User
    class Personalcolor(models.Model):
        objects = models.Manager()
        img = models.ImageField('personal_img',upload_to="personalcolor/", blank=True)
        user = models.ForeignKey(User, on_delete=models.CASCADE) # 补全此字段
    

    补全后同样执行迁移命令同步数据库。

  • 第二步:修改接口逻辑,传入关联用户
    如果你需要关联当前登录用户,首先要在前端请求头中带上用户身份凭证,修改你的请求头配置:

    const requestHeaders = {
        headers: {
            "Content-Type": "multipart/form-data",
            "Authorization": `Token ${userToken}` // 认证格式根据后端的认证方案调整,比如JWT的话前缀改为Bearer
        }
    }
    

    后端保存数据时手动传入当前登录用户:

    1. 直接操作模型的修改方式:
    image=request.FILES['img']
    personal_color=Personalcolor()
    personal_color.img=image
    personal_color.user = request.user # 新增此行
    personal_color.save()
    
    1. 序列化器的修改方式:
    serializer = ColorSerializer(data=request.data)
    if serializer.is_valid():
        serializer.save(user=request.user) # 给save方法传参即可
    else:
        return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST)
    
  • 临时兼容方案
    如果你暂时不需要关联用户,也可以将user字段设为允许为空,修改模型字段如下:

    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True)
    

    执行迁移后即可不用传入用户值直接保存数据。


内容的提问来源于stack exchange,提问作者Rebecca L

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 16:18:01