Продвинутый Django 5 для продолжающих

Прогресс по курсу:  0/193

8.3 Создание кастомной User модели
4 из 5 шагов пройдено
0 из 5 баллов  получено

Создание пользовательского менеджера

Согласно документации Django:

Менеджер - это интерфейс, через который выполняются операции запроса базы данных для моделей Django. Для каждой модели в приложении Django существует по крайней мере один менеджер.

Сначала нам нужно создать настраиваемый менеджер, расширив BaseUserManager. Это класс, который позволяет нам определять пользовательские поля для нашей модели.

Создайте файл manager.py в каталоге приложения accounts. Этот файл должен находиться в том же каталоге, что и файл models.py.

Базовый менеджер должен предоставить два дополнительных метода, а именно:

  • create_user
  • create_super_user

create_user принимает USERNAME_FIELD и остальные обязательные поля. USERNAME_FIELD, в нашем случае, будет полем электронной почты.

Откроем manager.py и начнем добавление кода, импортируя BaseUserManager из django.contrib.auth.models и создадим метод, который отвечает за создание нового пользователя:

from django.contrib.auth.models import BaseUserManager


class MyUserManager(BaseUserManager):

    def create_user(self, email, password=None):
        if not email:
            raise ValueError('Email must be provided')

        user = self.model(email=self.normalize_email(email))
        user.set_password(password)
        user.save(using=self._db)
        return user

Из приведенного выше кода create_user принимает два аргумента, адрес электронной почты и пароль, и будет отвечать за создание нового пользователя. 


Затем добавим метод create_super_user:

from django.contrib.auth.models import BaseUserManager


class MyUserManager(BaseUserManager):

    def create_user(self, email, password=None):
        if not email:
            raise ValueError('Email must be provided')

        user = self.model(email=self.normalize_email(email))
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password, **kwargs):
        user = self.create_user(email, password=password)
        user.is_admin = True
        user.save(using=self._db)
        return user

Функция пользователя create_super добавляет дополнительное поле is_admin, чтобы указать, что пользователь имеет права администратора.

 

Добавление пользовательского менеджера в класс модели

Теперь, когда мы закончили работать с пользовательским менеджером, теперь нам нужно добавить его в класс модели.

Откройте models.py и импортируйте MyUserManager вверху:

from .manager import MyUserManager


Затем добавьте его в качестве свойства в класс модели:

from django.db import models
from django.contrib.auth.models import AbstractBaseUser
from .manager import MyUserManager



class User(AbstractBaseUser):
    email = models.EmailField(max_length=255, unique=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_admin = models.BooleanField(default=False)
    created = models.DateTimeField(default=timezone.now)
    phone_regex = RegexValidator(regex=r'^((\+7)|8)\d{10}$',
                                 message="Phone number must be entered in the format: '+79999999999' or '89999999999'.")
    phone_number = models.CharField(validators=[phone_regex], max_length=12, unique=True)

    objects = MyUserManager() #new

...
..
.


Django предполагает, что пользовательская модель, это django.contrib.auth.models.User, нам нужно сказать Django использовать нашу пользовательскую модель, указав настройку AUTH_USER_MODEL в файле settings.py:

AUTH_USER_MODEL = 'accounts.User'


И теперь, если вам нужно использовать только что созданную пользовательскую модель, вам нужно импортировать ее из настроек. Например, предположим, что вам нужно использовать его в качестве внешнего ключа, вы будете использовать его, как показано ниже:

from django.conf import settings
from django.db import models


class Book(models.Model):
    title = models.EmailField(max_length=100)
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)


И в конце нам осталось выполнить миграции:

python manage.py makemigrations 
python manage.py migrate


Мы видим, что наша модель User была успешно создана. Также мы можем открыть нашу таблицу, и посмотреть какие поля находятся в нашей пользовательской таблице:


  • Комментария
Будьте вежливы и соблюдайте наши принципы сообщества. Пожалуйста, не оставляйте решения и подсказки в комментариях, для этого есть отдельный форум.
Оставить комментарий

Когда в свое время начинал изучать django, много где был описано что менеджер MyUserManager создавали прямо в models.py, без создания manager.py. Интересно есть ли тут какая принципиальная разница? Или это больше для эстетики написания кода?

@ILYA_Naumov, это только для эстетики кода. Вообще правильно разделять код по функционалу, чтобы было удобнее обслуживать не огромные файлы. Например, если мы имеем большое количество моделей, их правильнее тоже разделить, папка models и каждую модель в свой файл.

тут не ясно в какой файл это нужно добавлять (

 

И теперь, если вам нужно использовать только что созданную пользовательскую модель, вам нужно импортировать ее из настроек. Например, предположим, что вам нужно использовать его в качестве внешнего ключа, вы будете использовать его, как показано ниже:

from django.conf import settings
from django.db import models


class Book(models.Model):
    title = models.EmailField(max_length=100)
    author = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)

@No_Name, Пока некуда, это указано в качестве примера, как подключать кастомную юзер модель, там же написано:

Например, предположим, что вам нужно использовать его в качестве внешнего ключа, вы будете использовать его, как показано ниже: