Невозможно добавить ненулевое поле 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 к модели, содержащей поля для дополнительной информации. Такая модель один-к-одному часто называется моделью профиля, поскольку она может хранить информацию о пользователе сайта, не связанную с авторизацией.

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