Невозможно добавить ненулевое поле Error при расширении Abstract User
Я хочу расширить базовую абстрактную модель пользователя, и вот расширенная модель:
class Student(AbstractUser):
birth = models.DateField(default=datetime.date.today)
street = models.CharField(max_length=25)
street_number = models.IntegerField(validators=[MinValueValidator(0), MaxValueValidator(99)])
city = models.CharField(max_length=20)
province = models.CharField(max_length=20)
code = models.IntegerField(validators=[MinValueValidator(0, MaxValueValidator(9999))])
address = str(street) + str(street_number) + str(city) + str(code) + str(province)
Но я получаю это всплывающее сообщение:
It is impossible to add a non-nullable field 'password' to student without specifying a default. This is because the database needs something to populate existing rows.
Однако я не добавил новое поле пароля, и все существующие поля пароля (для суперпользователя) уже имеют значение. Что мне делать? Когда я добавляю значение по умолчанию и пытаюсь перенести его, он жалуется, что нет такой таблицы 'mainApp_student'
Вы не хотите этого делать. Вам нужна модель User (у вас уже есть модель, которую предоставляет Django, нет необходимости расширять ее на данный момент), и модель Student, которая имеет отношения OneToOne с моделью User. Концептуально:
User
: моделирует пользователя вашего приложения и его аутентификацию и разрешения .
Student
: представление человека, посещающего занятия, с именем, днем рождения и т.д..., также имеетuser
для доступа к вашему приложению, который является уникальным для него.
В коде:
from django.db import models
from django.contrib.auth.models import User
class Student(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE))
# ... other fields: birth address etc...
На этой странице документации это хорошо объясняется, особенно приведенный пример Employee:
Если вы хотите хранить информацию, связанную с пользователем, вы можете использовать OneToOneField к модели, содержащей поля для дополнительной информации. Такая модель один-к-одному часто называется моделью профиля, поскольку она может хранить информацию о пользователе сайта, не связанную с авторизацией.