SQL Django Null Constraint Error - не удается разрешить?

Что я делаю не так?

Django Models:

МОДЕЛЬ ПОЛЬЗОВАТЕЛЯ

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']

МОДЕЛЬ ЧЕЛОВЕКА

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)

МОДЕЛЬ СУБЪЕКТА

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)

У меня есть форма Sign Up, которая сохраняет email человека в User Model, а пароль в User Model, после проверки того, что email еще не существует, а пароли (при вводе дважды) совпадают. но затем я получаю эту ошибку, когда сохраняю форму:

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).

Есть идеи?

Общая идея моделей заключалась в том, чтобы позволить кому-то зарегистрироваться, указав электронную почту и пароль, с помощью модели User. Затем, войдя в систему, человек может ввести свое имя, фамилию, должность, псевдоним и т.д. в модели Person.

Ваша User-Model не позволяет null устанавливать в качестве значения для столбца related_person (ORM Django транслирует это в related_person_id в SQL)

По умолчанию это заставляет SQL наложить Null-Constraint на этот column.

Однако вы можете предотвратить Django от реализации такого Constraint, просто разобрав null = True как дополнительный аргумент к соответствующему столбцу вашей Model.

Таким образом, вы можете просто изменить ваши Модели на:

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']

# ...
Вернуться на верх