Вопрос или проблема
Вот краткий обзор того, что я достиг до сих пор, чтобы убедиться, что мы все на одной волне. Пожалуйста, обратите внимание, что я все еще новичок в 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
, и получаете сообщение об отсутствии изменений, возможны несколько причин:
-
Кэширование моделей: Если у вас уже были созданы миграции для вашего приложения и последующих изменений, иногда может произойти кэширование, которое не позволяет Django увидеть изменения. Попробуйте очистить кэш миграции при помощи следующей команды:
python3 manage.py migrate authorization zero
После этого снова выполните
makemigrations
иmigrate
. -
Проблемы с настройкой
AUTH_USER_MODEL
: Проверьте, правильно ли вы задалиAUTH_USER_MODEL
вsettings.py
:AUTH_USER_MODEL = 'authorization.User'
Убедитесь, что эта строка располагается ниже объявления
INSTALLED_APPS
, чтобы Django мог корректно распознать вашу модель. -
Неправильное объявление полей: Убедитесь, что все поля в вашей модели корректно объявлены. Например, в вашем тексте вы предполагаете, что поле
deletedAt
должно указывать на время удаления, но, по умолчанию, оно установлено какBooleanField
. Если вы планируете использовать "мягкое удаление", лучше сделать это полеDateTimeField
, чтобы отслеживать время удаления.
deletedAt = models.DateTimeField(null=True, blank=True)
Смотрите на то, как вы используете и называете поля; неправильное объявление может оказать влияние на процесс миграции.
4. Проверка файлов миграций
Также стоит убедиться, что в каталоге приложения authorization/migrations/
нет пропущенных файлов миграций, которые могли бы вызывать конфликт. Если такие файлы есть, их следует удалить, за исключением __init__.py
. После этого попробуйте снова выполнить команду makemigrations
.
Заключение
Работа с пользовательской моделью в Django может быть сложной задачей для новичка, но с тщательной проверкой шагов, описанных выше, вы сможете устранить проблемы с миграциями. Постарайтесь систематически анализировать каждый шаг и используйте возможности отладки, если столкнетесь с дальнейшими проблемами.
Если у вас возникнут дополнительные вопросы или потребуется дальнейшая помощь, не стесняйтесь обращаться за поддержкой. Успехов в разработке на Django!