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

Django多用户注册遇IntegrityError:user_id字段不可为null

问题描述

Django新手开发支持用户和医生登录的预约系统时,遇到以下问题:

  • 实现方案:继承AbstractUser自定义用户模型,与其他表建立一对一关联
  • 触发错误:注册提交时抛出IntegrityError at /auth/userreg/ (1048, "Column 'user_id' cannot be null")
  • 当前状态:仅尝试创建用户,未处理外键关联逻辑
错误原因
  1. User_reg模型中user字段是一对一关联的主键,数据库约束要求该字段不能为空,但你在保存User_reg时未绑定对应的User实例,直接保存触发完整性校验错误。
  2. 自定义User模型重复定义了first_name和last_name,而AbstractUser本身已包含这两个字段,属于冗余代码。
  3. views.py中错误导入了Django自带的User模型,而非你自定义的User模型。
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 15:24:16