'Creating a users and superusers with a custom `MyCompanyUser(AbstractUser)` related N:1 with `Customer(models.Model)` model

I am a Django rookie.

  1. I have created a Customer class.
  2. I have created a custom user class NeuroCloud(AbstractUser).
  3. Then relate them adding a foreign key field to the custom user class.
  4. When I try to create a supreuser with python manage.py createsuperuser an error (copied below) raises. The error seems to be raising because no primary key (associated to Customer) is given/is available.
  5. My goal is to be able to create users or superusers giving email, password and customer (no its primary key but its name which is unique).

Sorry for not being specific enough, but I am learning Django with no previous web programming experience.

The models would be something like this:

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

# Create your models here.
# TODO: docstrings (ONLY MEANINGFUL INFO!)


class Customer(models.Model):
    """
    """
    date_joined = models.DateTimeField(auto_now_add=False)


class NeuroCloudUser(AbstractUser):
    """
    """
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)

When I try to create a superuser, the following error raises:

Username: admin
Email address: <email hidden for privacity purposes>
Password: 
Password (again): 
This password is too short. It must contain at least 8 characters.
Bypass password validation and create user anyway? [y/N]: y
Traceback (most recent call last):
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
psycopg2.errors.NotNullViolation: el valor nulo en la columna «customer_id» de la relación «app_neuroclouduser» viola la restricción de no nulo
DETAIL:  La fila que falla contiene (2, pbkdf2_sha256$260000$w8MF3Sc8Ld0I6bE8hBAJGP$jXkjJ7QqbalpXvrEMSxC..., null, t, admin, , , <email hidden for privacity purposes>, t, t, 2022-05-18 14:59:42.56486+00, null).

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

Traceback (most recent call last):
  File "/home/yere/Repositories/neurocloud/manage.py", line 22, in <module>
    main()
  File "/home/yere/Repositories/neurocloud/manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/core/management/__init__.py", line 419, in execute_from_command_line
    utility.execute()
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/core/management/__init__.py", line 413, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/core/management/base.py", line 354, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 79, in execute
    return super().execute(*args, **options)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/core/management/base.py", line 398, in execute
    output = self.handle(*args, **options)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/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 "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/contrib/auth/models.py", line 163, in create_superuser
    return self._create_user(username, email, password, **extra_fields)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/contrib/auth/models.py", line 146, in _create_user
    user.save(using=self._db)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/contrib/auth/base_user.py", line 67, in save
    super().save(*args, **kwargs)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/models/base.py", line 726, in save
    self.save_base(using=using, force_insert=force_insert,
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/models/base.py", line 763, in save_base
    updated = self._save_table(
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/models/base.py", line 868, in _save_table
    results = self._do_insert(cls._base_manager, using, fields, returning_fields, raw)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/models/base.py", line 906, in _do_insert
    return manager._insert(
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/models/manager.py", line 85, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/models/query.py", line 1270, in _insert
    return query.get_compiler(using=using).execute_sql(returning_fields)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1416, in execute_sql
    cursor.execute(sql, params)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/backends/utils.py", line 98, in execute
    return super().execute(sql, params)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/backends/utils.py", line 66, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/backends/utils.py", line 75, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/yere/anaconda3/envs/neurocloud/lib/python3.9/site-packages/django/db/backends/utils.py", line 84, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.IntegrityError: el valor nulo en la columna «customer_id» de la relación «app_neuroclouduser» viola la restricción de no nulo
DETAIL:  La fila que falla contiene (2, pbkdf2_sha256$260000$w8MF3Sc8Ld0I6bE8hBAJGP$jXkjJ7QqbalpXvrEMSxC..., null, t, admin, , , <email hidden for privacity purposes>, t, t, 2022-05-18 14:59:42.56486+00, null).


Solution 1:[1]

In

class NeuroCloudUser(AbstractUser):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)

you are declaring field connecting your custom user to customer object, but you are making it field required, so when you are trying to create superuser, it needs to have some value in customer field. To make this field not required you should add blank=True and null=True:

class NeuroCloudUser(AbstractUser):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, blank=True, null=True)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 TrueGopnik