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 } }后端保存数据时手动传入当前登录用户:
- 直接操作模型的修改方式:
image=request.FILES['img'] personal_color=Personalcolor() personal_color.img=image personal_color.user = request.user # 新增此行 personal_color.save()- 序列化器的修改方式:
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
相关产品推荐
相关产品推荐

