Невозможно указать тип возврата для 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.

Вернуться на верх