Ошибка целостности SQLite3 при выполнении команды "createsuperuser"
Я пытаюсь расширить стандартную модель Django User, связываясь с ней через OneToOneField.
Я успешно перенес изменения и зарегистрировал свою модель Profile внутри admin.py, однако, когда я пытаюсь выполнить команду python manage.py createsuperuser
и заполнить информацию, я получаю Integrity Error.
django.db.utils.IntegrityError: NOT NULL constraint failed: accounts_profile.date_of_birth
Я знаю, в чем проблема. У меня есть поле date_of_birth, которое является обязательным, и я не могу оставить его пустым, это вызывает исключение.
Я хочу простое решение, но не смог придумать его, и я не хочу добавлять кучу сниппетов blank=True
ко всем моим обязательным полям.
Вот мой код.
- models.py
from django.contrib.auth.models import User
from django.db import models
class Language(models.Model):
# - [ CHOICES ] - #
name = models.CharField(max_length=20)
# - [ METHODS ] - #
def __str__(self):
return self.name
class Skill(models.Model):
# - [ CHOICES ] - #
name = models.CharField(max_length=20)
# - [ METHODS ] - #
def __str__(self):
return self.name
class Profile(models.Model):
# - [ CHOICES ] - #
GENDER_CHOICES = [
('Female', 'Female'),
('Male', 'Male')
]
EDUCATIONAL_LEVEL_CHOICES = [
('None', 'None'),
('Primary School', 'Primary School'),
('Secondary School', 'Secondary School'),
('High School', 'High School'),
('Bachelor\'s Degree', 'Bachelor\'s Degree'),
('Master\'s Degree', 'Master\'s Degree'),
('PhD', 'PhD')
]
MEDICAL_CONDITIONS_CHOICES = [
('None', 'None'),
('Chronic Disease', 'Chronic Disease'),
('Allergies', 'Allergies'),
('COVID-19', 'COVID-19')
]
ROLES_CHOICES = [
(1, 'Volunteer'),
(2, 'Content Editor'),
(3, 'Board Member'),
(4, 'Founder')
]
# - [ FIELDS ] - #
user = models.OneToOneField(User, on_delete=models.CASCADE)
first_name = models.CharField(max_length=20, blank=False)
middle_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20, blank=False)
date_of_birth = models.DateField()
gender = models.CharField(max_length=6, choices=GENDER_CHOICES)
primary_phone_number = models.CharField(max_length=15)
backup_phone_number = models.CharField(max_length=15, blank=True)
street_address = models.CharField(max_length=40)
educational_level = models.CharField(max_length=20, choices=EDUCATIONAL_LEVEL_CHOICES)
medical_condition = models.CharField(max_length=15, choices=MEDICAL_CONDITIONS_CHOICES)
role = models.PositiveSmallIntegerField(default=1, choices=ROLES_CHOICES)
occupation = models.CharField(max_length=40)
biography = models.TextField(max_length=500, blank=True)
kokar_points = models.PositiveIntegerField(default=0)
is_email_verified = models.BooleanField(default=False)
is_subscribed_to_newsletter = models.BooleanField(default=True)
is_vaccinated = models.BooleanField(default=False)
profile_photo = models.ImageField(upload_to='profile_photos/')
id_photo = models.ImageField(upload_to='id_photos/')
vaccination_card_photo = models.ImageField(upload_to='vaccination_card_photos/', blank=True, null=True)
languages = models.ManyToManyField(Language)
skills = models.ManyToManyField(Skill)
# - [ METHODS ] - #
def __str__(self):
return self.get_full_name()
def get_full_name(self):
return f'{self.first_name} {self.middle_name} {self.last_name}'
- signals.py
from django.db.models.signals import post_save
from django.contrib.auth.models import User
from django.dispatch import receiver
from .models import Profile
@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
@receiver(post_save, sender=User)
def save_user_profile(sender, instance, **kwargs):
instance.profile.save()
Вам нужно удалить файлы миграции и снова выполнить команду python manage.py makemigrations
. Когда появится запрос на однократное значение по умолчанию, вы можете использовать timezone.now, чтобы заполнить уже существующие строки в базе данных.
Я решил эту проблему, предоставив значение по умолчанию для поля date_of_birth.