Django多用户注册遇IntegrityError:user_id字段不可为null
问题描述
Django新手开发支持用户和医生登录的预约系统时,遇到以下问题:
- 实现方案:继承
AbstractUser自定义用户模型,与其他表建立一对一关联 - 触发错误:注册提交时抛出
IntegrityError at /auth/userreg/ (1048, "Column 'user_id' cannot be null") - 当前状态:仅尝试创建用户,未处理外键关联逻辑
错误原因
User_reg模型中user字段是一对一关联的主键,数据库约束要求该字段不能为空,但你在保存User_reg时未绑定对应的User实例,直接保存触发完整性校验错误。- 自定义
User模型重复定义了first_name和last_name,而AbstractUser本身已包含这两个字段,属于冗余代码。 views.py中错误导入了Django自带的User模型,而非你自定义的User模型。User_reg中的Username和Userpassword字段完全多余,自定义User模型已包含账号密码相关字段。
修复步骤
1. 修正模型定义
移除冗余字段,简化模型结构:
# authenticate_me/models.py from django.db import models from django.contrib.auth.models import AbstractUser class User(AbstractUser): is_user = models.BooleanField('普通用户', default=False) is_doctor = models.BooleanField('医生', default=False) # 移除重复的first_name、last_name,AbstractUser已自带 class User_reg(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True) fname = models.CharField(max_length=50, blank=False) lname = models.CharField(max_length=50, blank=False) email = models.EmailField(max_length=100, blank=False) address = models.TextField(max_length=500, blank=False) gender = models.CharField(max_length=7, blank=False) phone = models.CharField(max_length=12, unique=True, blank=False) # 删除多余的Username、Userpassword字段
2. 调整注册逻辑顺序
先创建并保存User实例,再用该实例关联创建User_reg,确保外键字段不为空:
# views.py from django.shortcuts import render from django.contrib import messages from authenticate_me.models import User, User_reg, dr_reg # 导入自定义User模型 def login(request): return render(request, 'user/login.html') def register(request): if request.method == "POST": fname = request.POST.get('fname') lname = request.POST.get('lname') email = request.POST.get('email') address = request.POST.get('add') gender = request.POST.get('sex') phone = request.POST.get('phone') username = request.POST.get('uname') userpassword = request.POST.get('upass') # 先创建并保存User实例 myuser = User.objects.create_user(username=username, email=email, password=userpassword) myuser.first_name = fname myuser.last_name = lname myuser.is_user = True # 标记为普通用户角色 myuser.save() # 用已创建的User实例关联创建User_reg user_reg = User_reg( user=myuser, fname=fname, lname=lname, email=email, address=address, gender=gender, phone=phone ) user_reg.save() messages.success(request, '注册成功') return render(request,'user/login.html') else: return render(request, 'user/register.html')
内容的提问来源于stack exchange,提问作者Ashraf Patel
相关产品推荐
相关产品推荐

