简体   繁体   中英

django.db.utils.IntegrityError: NOT NULL constraint failed: accounts_user.user_id

I'm trying to create a multiple user model in django. I am new to django and as such not in a position to get the exact result I need.

I get an error when trying to createsuperuser.

Here is my models.py

from django.db import models
from django.contrib.auth.models import AbstractUser

ROLES =(
        ('main', 'Main'),
        ('teacher', 'Teacher'),
        ('student', 'Student'),
        )

Here's my register and function

def Register(request):
    if request.method == 'POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            first_name = form.cleaned_data.get('first_name')
            last_name = form.cleaned_data.get('last_name')
            password1 = form.cleaned_data.get('password1')
            messages.success(request, f'An account has successfully been created for {first_name} {last_name}. Username is {username} and password is {password1}')
            return redirect('login')
    else:
        form = RegistrationForm()
    return render(request, 'register.html', {'form': form})

class School(models.Model):
    name = models.CharField(max_length=100, null=False, blank=False)

class User(AbstractUser):
    user = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
    role = models.CharField(max_length=10, choices=ROLES, blank=False, null=False)


class Teacher(models.Model):
    school = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
    name  = models.CharField(max_length=30, blank=False, null=False)
    code = models.CharField(max_length=30, blank=False, null=False)


class Student(models.Model):
    school = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
    first_name  = models.CharField(max_length=30, blank=False, null=False)
    last_name = models.CharField(max_length=30, blank=False, null=False)
    adm = models.CharField(max_length=30, blank=False, null=False)

class Main(models.Model):
    school = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
    name  = models.CharField(max_length=30, blank=False, null=False)

My admin.py

from django.contrib import admin
from .models import User, School

admin.site.register(School)
admin.site.register(User)

Trying to create a superuser throws the following traceback

(env) D:\Python\Django\Links Online Exams\Links_Online_Results>python manage.py createsuperuser
Username: ptar
Email address: peterolwande@gmail.com
Password:
Password (again):
Traceback (most recent call last):
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\sqlite3\base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
sqlite3.IntegrityError: NOT NULL constraint failed: accounts_user.user_id

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\management\__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\management\__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\management\base.py", line 330, in run_from_argv
    self.execute(*args, **cmd_options)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 79, in execute
    return super().execute(*args, **options)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\core\management\base.py", line 371, in execute
    output = self.handle(*args, **options)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 189, in handle
    self.UserModel._default_manager.db_manager(database).create_superuser(**user_data)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\models.py", line 157, in create_superuser
    return self._create_user(username, email, password, **extra_fields)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\models.py", line 140, in _create_user
    user.save(using=self._db)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\contrib\auth\base_user.py", line 67, in save
    super().save(*args, **kwargs)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\base.py", line 753, in save
    self.save_base(using=using, force_insert=force_insert,
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\base.py", line 790, in save_base
    updated = self._save_table(
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\base.py", line 895, in _save_table
    results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\base.py", line 933, in _do_insert
    return manager._insert(
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\query.py", line 1254, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\models\sql\compiler.py", line 1397, in execute_sql
    cursor.execute(sql, params)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 98, in execute
    return super().execute(sql, params)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "D:\Python\Django\Links Online Exams\env\lib\site-packages\django\db\backends\sqlite3\base.py", line 413, in execute
    return Database.Cursor.execute(self, query, params)
django.db.utils.IntegrityError: NOT NULL constraint failed: accounts_user.user_id
class User(AbstractUser):
    user = models.ForeignKey(School, on_delete=models.PROTECT, null=False, blank=False)
    role = models.CharField(max_length=10, choices=ROLES, blank=False, null=False)

In User model, there is a non-nullable field called user which is a ForeignKey to School .

When creating superuser using django management command, it will ask only for username, email, password.

In this scenario, user (aka ForeignKey to School) will be empty which is why it is failing with user_id is null.

There are 2 ways to handle this.

  1. Make user field nullable. With this createsuperuser will be able to create new users. Later you can populate user field.
  2. Write your own management command which takes all required fields to create user and the create a superuser.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM