Невозможно указать тип возврата для Django Manager для пользовательской модели пользователя
Я реализовал пользовательскую модель пользователя, наследующую от AbstractUser
:
"""This module contains models for the users app."""
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import gettext_lazy as _
from users.managers import UserManager
class User(AbstractUser):
"""Class that implements a custom User model with admin permissions."""
# Fields to remove from AbstractUser
username = None # type: ignore
date_joined = None # type: ignore
# Fields to modify from AbstractUser
email = models.EmailField(_('email address'), unique=True)
# Custom fields
middle_name = models.CharField(_('middle name'), max_length=150, blank=True)
second_last_name = models.CharField(_('second last name'), max_length=150, blank=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS: list[str] = []
objects = UserManager() # type: ignore
def __str__(self) -> str:
return self.email
I have also defined my custom manager UserManager
which inherits from BaseUserManager
as follows:
from typing import Any
from django.contrib.auth.base_user import BaseUserManager
class UserManager(BaseUserManager):
def create_user(self, email: str, password: str, **extra_fields):
if not email:
raise ValueError('Email for user must be set.')
email = self.normalize_email(email)
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email: str, password: str, **extra_fields: Any):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True.')
if extra_fields.get('is_superuser') is not True:
raise ValueError('Superuser must have is_superuser=True.')
return self.create_user(email, password, **extra_fields)
Но если я добавляю возвращаемый тип, User
, используя подсказку типа, я получаю ошибку:
from django.contrib.auth import get_user_model
User = get_user_model()
class UserManager(BaseUserManager):
def create_user(self, email: str, password: str, **extra_fields) -> User:
Эту ошибку я получаю, когда запускаю mypy
:
django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'users.User' that has not been installed
Это мой файл настроек:
Не могли бы вы добавить следующий код в вашу модель пользователя
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
Ваша User
модель должна быть такой
class User(AbstractUser):
"""Class that implements a custom User model with admin permissions."""
# Fields to remove from AbstractUser
username = None # type: ignore
date_joined = None # type: ignore
# Fields to modify from AbstractUser
email = models.EmailField(_('email address'), unique=True)
# Custom fields
middle_name = models.CharField(_('middle name'), max_length=150, blank=True)
second_last_name = models.CharField(_('second last name'), max_length=150, blank=True)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS: list[str] = []
objects = UserManager() # type: ignore
class Meta:
verbose_name = _('user')
verbose_name_plural = _('users')
def __str__(self) -> str:
return self.email
При добавлении пунктирного пути к конфигурационному классу в INSTALLED_APPS
, вы должны поместить default_app_config
в __init__.py
файл в этом конкретном приложении.
В вашем случае, поместите default_app_config='users.apps.UsersConfig'
в __init__.py
файл, расположенный в users
app.