Создание пользовательского менеджера
Согласно документации Django:
Менеджер - это интерфейс, через который выполняются операции запроса базы данных для моделей Django. Для каждой модели в приложении Django существует по крайней мере один менеджер.
Сначала нам нужно создать настраиваемый менеджер, расширив BaseUserManager. Это класс, который позволяет нам определять пользовательские поля для нашей модели.
Создайте файл manager.py в каталоге приложения accounts. Этот файл должен находиться в том же каталоге, что и файл models.py.
Базовый менеджер должен предоставить два дополнительных метода, а именно:
create_usercreate_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 была успешно создана. Также мы можем открыть нашу таблицу, и посмотреть какие поля находятся в нашей пользовательской таблице: