Проблемы с пониманием того, как создать пользовательскую модель в Django.

Вопрос или проблема

Вот краткий обзор того, что я достиг до сих пор, чтобы убедиться, что мы все на одной волне. Пожалуйста, обратите внимание, что я все еще новичок в Django, поэтому мой подход может быть не идеальным или даже близким к тому, каким он должен быть.

Создал новый проект Django и сразу же применил первоначальные миграции (18 или 19).

Следующее, что я сделал, это создал новое приложение под названием “authorization”, вот так:

python3 manage.py startapp authorization

Затем я добавил его в список “INSTALLED_APPS” в файле settings.py моего проекта.

После этого я создал следующее в файле models.py:

from django.db import models
from django.core.validators import MinValueValidator
from django.utils import timezone

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin

class CustomUserManager(BaseUserManager):
    def create_user(self, email, password, **extra_fields):
        if not email:
            raise ValueError('Пожалуйста, предоставьте значение для email!')
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self.db)
        return user

    def create_superuser(self, email, password, **extra_fields):
        extra_fields.setdefault('role', 'OWNER')
        extra_fields.setdefault('subscribed', True)
        return self.create_user(email, password, **extra_fields)

class User(AbstractBaseUser, PermissionsMixin):
    # id предоставляется по умолчанию
    username = models.CharField(
        max_length=30, 
        unique=True
    )
    email = models.EmailField(unique=True)
    # пароль предоставляется по умолчанию
    favoriteFood = models.CharField(max_length=255)
    favoriteSnack = models.CharField(max_length=255)
    favoriteDrink = models.CharField(max_length=255)
    # Определение ролей
    ROLE_CHOICES = [
        ('USER', 'Пользователь'),
        ('CREATOR', 'Создатель'),
        ('ADMIN', 'Администратор'),
        ('OWNER', 'Владелец'),
    ]
    role = models.CharField(
        max_length=10, 
        choices=ROLE_CHOICES, 
        default="USER"
    )
    createdAt = models.DateTimeField(auto_now_add=True)
    updatedAt = models.DateTimeField(auto_now=True)
    deletedAt = models.BooleanField(default=True)

    def soft_delete(self):
        self.deletedAt = timezone.now()

    objects = CustomUserManager()

    USERNAME_FIELD = 'email'

    REQUIRED_FIELDS = ['username']

    def __str__(self):
        return self.email

Затем я создал ключ под названием “AUTH_USER_MODEL” и установил его на “authorization.User”.

Но затем, когда я делаю

python3 manage.py makemigrations

Я получаю в ответ

Изменений не обнаружено

Почему мои изменения не распознаются?

Ответ или решение

Вопрос, с которым вы столкнулись, касается создания пользовательской модели пользователя (Custom User Model) в Django. Давайте проанализируем шаги, которые вы уже выполнили, и определим, что может быть причиной вашей проблемы, связанной с тем, что команда makemigrations не обнаруживает изменений.

1. Основывающая структура проекта

Вы правильно создали новый проект Django и приложение authorization, а также добавили приложение в список INSTALLED_APPS в файле settings.py. Это важный шаг, так как Django использует этот список для отслеживания установленных приложений при выполнении миграций.

2. Создание модели пользователя

Вы создали собственный менеджер пользователя (CustomUserManager) и саму модель пользователя (User), унаследованную от AbstractBaseUser и PermissionsMixin. Основа вашей модели выглядит корректно, однако стоит обратить внимание на несколько параметров:

  • Убедитесь, что все необходимые поля настроены правильно.
  • Так как вы используете email в качестве основного поля для аутентификации (что подразумевается установкой USERNAME_FIELD), проверьте, вы не упустили какие-либо дополнительные настройки.

3. Проблема с миграциями

Когда вы запускаете команду python3 manage.py makemigrations, и получаете сообщение об отсутствии изменений, возможны несколько причин:

  1. Кэширование моделей: Если у вас уже были созданы миграции для вашего приложения и последующих изменений, иногда может произойти кэширование, которое не позволяет Django увидеть изменения. Попробуйте очистить кэш миграции при помощи следующей команды:

    python3 manage.py migrate authorization zero

    После этого снова выполните makemigrations и migrate.

  2. Проблемы с настройкой AUTH_USER_MODEL: Проверьте, правильно ли вы задали AUTH_USER_MODEL в settings.py:

    AUTH_USER_MODEL = 'authorization.User'

    Убедитесь, что эта строка располагается ниже объявления INSTALLED_APPS, чтобы Django мог корректно распознать вашу модель.

  3. Неправильное объявление полей: Убедитесь, что все поля в вашей модели корректно объявлены. Например, в вашем тексте вы предполагаете, что поле deletedAt должно указывать на время удаления, но, по умолчанию, оно установлено как BooleanField. Если вы планируете использовать "мягкое удаление", лучше сделать это поле DateTimeField, чтобы отслеживать время удаления.

deletedAt = models.DateTimeField(null=True, blank=True)

Смотрите на то, как вы используете и называете поля; неправильное объявление может оказать влияние на процесс миграции.

4. Проверка файлов миграций

Также стоит убедиться, что в каталоге приложения authorization/migrations/ нет пропущенных файлов миграций, которые могли бы вызывать конфликт. Если такие файлы есть, их следует удалить, за исключением __init__.py. После этого попробуйте снова выполнить команду makemigrations.

Заключение

Работа с пользовательской моделью в Django может быть сложной задачей для новичка, но с тщательной проверкой шагов, описанных выше, вы сможете устранить проблемы с миграциями. Постарайтесь систематически анализировать каждый шаг и используйте возможности отладки, если столкнетесь с дальнейшими проблемами.

Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться за поддержкой. Успехов в разработке на Django!

Оцените материал
Добавить комментарий

Капча загружается...