Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

SQL Django Null Constraint Error – cannot resolve?

What am I doing wrong?

Django Models:

USER MODEL

class User(AbstractUser):

    # DEFINE MODEL FIELDS
    related_person  = models.OneToOneField(Person, on_delete=models.CASCADE, default='')
    user_id         = models.BigAutoField(verbose_name='User ID', primary_key=True, serialize=False, auto_created=True)
    email           = models.EmailField(verbose_name='Email', max_length=80, blank=False, unique=True, null=False, default='')
    is_verified     = models.BooleanField(verbose_name='Email Verified', blank=False, default=False)
    date_joined     = models.DateField(verbose_name='date joined', auto_now_add=True, null=True)
    last_login      = models.DateField(verbose_name='last login', auto_now=True, null=True)
    is_active       = models.BooleanField(default=True)
    is_admin        = models.BooleanField(default=False)
    is_staff        = models.BooleanField(default=False)
    is_superuser    = models.BooleanField(default=False)
    first_name      = None
    last_name       = None
    username        = None

    # IMPORT MODEL MANAGER CLASS
    objects = UserManager()

    # SET LOGIN FIELD
    USERNAME_FIELD = 'email'

# SET REQUIRED FIELDS
REQUIRED_FIELDS = ['is_verified']

PERSON MODEL

class Person(models.Model):

    class Titles(models.TextChoices):
        MR = 'Mr', _('Mr')
        MRS = 'Mrs', _('Mrs')
        MISS = 'Miss', _('Miss')
        MS = 'Ms', _('Ms')
        DR = 'Dr', _('Dr')

    related_entity  = models.OneToOneField(Entity, on_delete=models.CASCADE)
    person_id       = models.BigAutoField(verbose_name='Person ID', primary_key=True, serialize=False, auto_created=True)
    first_name      = models.CharField(verbose_name='First Name', max_length=50, blank=False, null=False)
    last_name       = models.CharField(verbose_name='Last Name', max_length=50, blank=False, null=False)
    title           = models.CharField(verbose_name='Title', max_length=4, choices=Titles.choices, blank=True, null=False, default='')
    alias           = models.CharField(verbose_name='Alias', max_length=150, blank=True, null=False)

ENTITY MODEL

class Entity(models.Model):

    class EntityTypes(models.TextChoices):
        PERSON = 'Person', _('Person')
        COMPANY = 'Company', _('Company')

    entity_type = models.CharField(
                verbose_name='Legal Entity Type', 
                max_length=7, 
                choices=EntityTypes.choices, 
                default=EntityTypes.PERSON, 
                blank=False, 
                null=False)

I have a Sign Up form that saves a person’s email to the User Model, and password to the User Model, after checking the email doesn’t already exist, and passwords (when entered twice), match. but then I get this error when I save the form:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

null value in column "related_person_id" of relation "customauth_user" violates not-null constraint
DETAIL:  Failing row contains (1, pbkdf2_sha256$320000$Ipsu5kX2Opd2a1j9996ReS$uPR4GCbSxS7+9+0KIAaE..., sachin@cantab.net, f, 2022-02-28, 2022-02-28, t, f, f, f, null).

Any ideas?

The overall idea behind the models was to allow a someone to signup with an email and password, through the User model. Then once they’ve logged in, they can enter their firstname, lastname, title, alias, etc, in the Person model.

>Solution :

Your User-Model does not allow null to be set as value for the column related_person (Django’s ORM transpiles this to related_person_id in SQL)

By default this causes SQL to put a Null-Constraint on that column.

However you can prevent Django from implementing such a Constraint, by simply parsing null = True as additional argument to the affected column of your Model.

Thus you can simply change your Models to:

class User(AbstractUser):

    # DEFINE MODEL FIELDS
    related_person  = models.OneToOneField(Person, on_delete=models.CASCADE, default='', null=True) # allowing null-values
    user_id         = models.BigAutoField(verbose_name='User ID', primary_key=True, serialize=False, auto_created=True)
    email           = models.EmailField(verbose_name='Email', max_length=80, blank=False, unique=True, null=False, default='')
    is_verified     = models.BooleanField(verbose_name='Email Verified', blank=False, default=False)
    date_joined     = models.DateField(verbose_name='date joined', auto_now_add=True, null=True)
    last_login      = models.DateField(verbose_name='last login', auto_now=True, null=True)
    is_active       = models.BooleanField(default=True)
    is_admin        = models.BooleanField(default=False)
    is_staff        = models.BooleanField(default=False)
    is_superuser    = models.BooleanField(default=False)
    first_name      = None
    last_name       = None
    username        = None

    # IMPORT MODEL MANAGER CLASS
    objects = UserManager()

    # SET LOGIN FIELD
    USERNAME_FIELD = 'email'

# SET REQUIRED FIELDS
REQUIRED_FIELDS = ['is_verified']

# ...
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading